सवाल आधिकारिक PostgreSQL डॉकर छवि की कॉन्फ़िगरेशन फ़ाइल को कस्टमाइज़ कैसे करें?


मैं इसका उपयोग कर रहा हूँ आधिकारिक पोस्टग्रेज़ डॉकर छवि इसकी विन्यास को अनुकूलित करने की कोशिश कर रहा है। इस उद्देश्य के लिए, मैं कमांड का उपयोग करता हूं sed बदलने के लिए max_connections उदाहरण के लिए:

sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf

मैंने इस कॉन्फ़िगरेशन को लागू करने के लिए दो विधियों का प्रयास किया। पहला आदेश स्क्रिप्ट में जोड़कर और इसे init फ़ोल्डर "/docker-entrypoint-initdb.d" में कॉपी करके है। दूसरी विधि उन्हें सीधे "डॉन" कमांड के साथ अपने डॉकरफ़ाइल में चलाकर (यह विधि कॉन्फ़िगरेशन फ़ाइल "/ etc / postgres / ..." के एक अलग पथ के साथ गैर-आधिकारिक पोस्टग्रेस्क्ल छवि के साथ ठीक काम करती है। दोनों स्थितियों में परिवर्तन विफल हो जाते हैं क्योंकि कॉन्फ़िगरेशन फ़ाइल गुम होती है (मुझे लगता है कि यह अभी तक नहीं बनाया गया है)।

मुझे कॉन्फ़िगरेशन कैसे बदलना चाहिए?

संपादित करें 1:

छवि बनाने के लिए इस्तेमाल किया गया डॉकरफ़ाइल यहां दिया गया है:

# Database (http://www.cs3c.ma/)

FROM postgres:9.4
MAINTAINER Sabbane <contact@cs3c.ma>

ENV TERM=xterm

RUN apt-get update
RUN apt-get install -y nano

ADD scripts /scripts
# ADD scripts/setup-my-schema.sh /docker-entrypoint-initdb.d/

# Allow connections from anywhere.
RUN sed -i -e"s/^#listen_addresses =.*$/listen_addresses = '*'/" /var/lib/postgresql/data/postgresql.conf
RUN echo "host    all    all    0.0.0.0/0    md5" >> /var/lib/postgresql/data/pg_hba.conf

# Configure logs
RUN sed -i -e"s/^#logging_collector = off.*$/logging_collector = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_directory = 'pg_log'.*$/log_directory = '\/var\/log\/postgresql'/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_filename = 'postgresql-\%Y-\%m-\%d_\%H\%M\%S.log'.*$/log_filename = 'postgresql_\%a.log'/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_file_mode = 0600.*$/log_file_mode = 0644/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_truncate_on_rotation = off.*$/log_truncate_on_rotation = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_rotation_age = 1d.*$/log_rotation_age = 1d/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_min_duration_statement = -1.*$/log_min_duration_statement = 0/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_checkpoints = off.*$/log_checkpoints = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_connections = off.*$/log_connections = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_disconnections = off.*$/log_disconnections = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^log_line_prefix = '\%t \[\%p-\%l\] \%q\%u@\%d '.*$/log_line_prefix = '\%t \[\%p\]: \[\%l-1\] user=\%u,db=\%d'/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_lock_waits = off.*$/log_lock_waits = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_temp_files = -1.*$/log_temp_files = 0/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#statement_timeout = 0.*$/statement_timeout = 1800000        # in milliseconds, 0 is disabled (current 30min)/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^lc_messages = 'en_US.UTF-8'.*$/lc_messages = 'C'/" /var/lib/postgresql/data/postgresql.conf

# Performance Tuning
RUN sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^shared_buffers =.*$/shared_buffers = 16GB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#effective_cache_size = 128MB.*$/effective_cache_size = 48GB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#work_mem = 1MB.*$/work_mem = 16MB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#maintenance_work_mem = 16MB.*$/maintenance_work_mem = 2GB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#checkpoint_segments = .*$/checkpoint_segments = 32/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#checkpoint_completion_target = 0.5.*$/checkpoint_completion_target = 0.7/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#wal_buffers =.*$/wal_buffers = 16MB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#default_statistics_target = 100.*$/default_statistics_target = 100/" /var/lib/postgresql/data/postgresql.conf


VOLUME ["/var/lib/postgresql/data", "/var/log/postgresql"]

CMD ["postgres"]

इस डॉकरफाइल के साथ बिल्ड प्रक्रिया त्रुटि दिखाती है: sed: can't read /var/lib/postgresql/data/postgresql.conf: No such file or directory


44
2018-06-15 15:08


मूल


एक विधि आधिकारिक छवि का उपयोग करना, इसे शुरू करना, अंदर से कनेक्ट करना है docker exec -it container_id bash फिर, अपने संशोधन करें docker commit container_id myuser/myimage_myPostegresql:myversionडॉक्टर देखें docs.docker.com/reference/commandline/cli/#commit - user2915097
मुझे लगता है कि डॉकर प्रतिमान के फायदों में से एक पूरे निर्माण प्रक्रिया को स्वचालित करना है। जैसा कि एक और छवि के साथ उल्लेख किया गया है, paintedfox/postgresql, सीधे डॉकरफ़ाइल के भीतर कॉन्फ़िगरेशन को बदलना संभव है। मुझे लगता है कि आधिकारिक छवि के साथ भी संभव होना चाहिए। - Sakr
sed विधि काम करना चाहिए, क्या आप अपने Dcokerfile या एक पूर्ण प्रजनन पोस्ट कर सकते हैं? - user2915097
मैंने छवि बनाने के लिए इस्तेमाल डॉकरफ़ाइल जोड़ा है - Sakr


जवाब:


postgres:9.4 जिस छवि को आपने विरासत में प्राप्त किया है, वह वॉल्यूम घोषित करता है /var/lib/postgresql/data। इसका अनिवार्य रूप से मतलब है कि आप अपनी छवि में किसी भी फाइल को उस पथ पर कॉपी नहीं कर सकते हैं; परिवर्तनों को त्याग दिया जाएगा।

आपके पास कुछ विकल्प हैं:

  • आप अपनी खुद की कॉन्फ़िगरेशन फ़ाइलों को रन-टाइम पर वॉल्यूम के रूप में जोड़ सकते हैं docker run -v postgresql.conf:/var/lib/postgresql/data/postgresql.conf ...। हालांकि, मुझे यकीन नहीं है कि यह मौजूदा मात्रा के साथ कैसे बातचीत करेगा।

  • कंटेनर शुरू होने पर आप फ़ाइल को प्रतिलिपि बना सकते हैं। ऐसा करने के लिए, अपनी फ़ाइल को उस स्थान पर बिल्ड में कॉपी करें जो वॉल्यूम के नीचे नहीं है, फिर एंट्रीपॉइंट या cmd से एक स्क्रिप्ट को कॉल करें जो फ़ाइल को सही स्थान पर कॉपी करने और पोस्टग्रेस शुरू करने के लिए कॉपी करेगा।

  • पोस्टग्रेस आधिकारिक छवि के पीछे प्रोजेक्ट को क्लोन करें और वॉल्यूम घोषित करने से पहले अपनी स्वयं की कॉन्फ़िगरेशन फ़ाइल जोड़ने के लिए डॉकरफ़ाइल संपादित करें (वॉल्यूम निर्देश से पहले जोड़ा गया कुछ भी स्वचालित रूप से रन-टाइम पर कॉपी किया गया है)।


25
2018-06-15 16:18



यही वह था, परिवर्तन डॉकरफाइल के भीतर नहीं होना चाहिए। मैंने उन्हें एक स्क्रिप्ट में स्थानांतरित कर दिया है और इसे एंट्रीपॉइंट से बुलाया है और यह ठीक काम करता है। जवाब के लिए धन्यवाद। - Sakr
मैंने सिर्फ स्क्रिप्ट को init फ़ोल्डर "/docker-entrypoint-initdb.d/" में कॉपी किया है और यह इस बार ठीक काम करता है। यह अजीब है लेकिन ऐसा लगता है कि मैं डॉकरफाइल के साथ छवि को सेट करने पर इतना ध्यान केंद्रित कर रहा था, क्योंकि मुझे अधिकांश छवियों के साथ उपयोग करने के लिए उपयोग किया जाता है, कि मैंने इनिट स्क्रिप्ट का उपयोग करके अपनी पहली कोशिशों के साथ कुछ याद किया। - Sakr


डॉकर लिखें के साथ

डॉकर कंपोज़ के साथ काम करते समय, आप इसका उपयोग कर सकते हैं command: postgres -c option=value आपके में docker-compose.yml Postgres को कॉन्फ़िगर करने के लिए।

उदाहरण के लिए, यह पोस्टग्रेस को फ़ाइल में लॉग करता है:

command: postgres -c logging_collector=on -c log_destination=stderr -c log_directory=/logs

अनुकूल Vojtech Vitek का जवाब, आप उपयोग कर सकते हैं

command: postgres -c config_file=/etc/postgresql.conf

कॉन्फ़िगरेशन फ़ाइल को बदलने के लिए पोस्टग्रेस का उपयोग किया जाएगा। आप अपनी कस्टम कॉन्फ़िगरेशन फ़ाइल को वॉल्यूम के साथ माउंट करेंगे:

volumes:
   - ./customPostgresql.conf:/etc/postgresql.conf

यहाँ है docker-compose.yml मेरे आवेदन के, पोस्टग्रेज़ को कॉन्फ़िगर करने का तरीका दिखा रहा है:

# Start the app using docker-compose pull && docker-compose up to make sure you have the latest image
version: '2.1'    
services:
  myApp:
    image: registry.gitlab.com/bullbytes/myApp:latest
    networks:
      - myApp-network
  db:
     image: postgres:9.6.1
     # Make Postgres log to a file.
     # More on logging with Postgres: https://www.postgresql.org/docs/current/static/runtime-config-logging.html
     command: postgres -c logging_collector=on -c log_destination=stderr -c log_directory=/logs
     environment:
       # Provide the password via an environment variable. If the variable is unset or empty, use a default password
       - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-4WXUms893U6j4GE&Hvk3S*hqcqebFgo!vZi}
     # If on a non-Linux OS, make sure you share the drive used here. Go to Docker's settings -> Shared Drives
     volumes:
       # Persist the data between container invocations
       - postgresVolume:/var/lib/postgresql/data
       - ./logs:/logs
     networks:
       myApp-network:
         # Our application can communicate with the database using this hostname
         aliases:
           - postgresForMyApp
networks:
  myApp-network:
    driver: bridge    
# Creates a named volume to persist our data. When on a non-Linux OS, the volume's data will be in the Docker VM
# (e.g., MobyLinuxVM) in /var/lib/docker/volumes/
volumes:
  postgresVolume:

लॉग निर्देशिका में लिखने की अनुमति

ध्यान दें कि जब लिनक्स पर, होस्ट पर लॉग निर्देशिका में सही अनुमति होनी चाहिए। अन्यथा आप थोड़ा भ्रामक त्रुटि प्राप्त करेंगे

FATAL: लॉग फ़ाइल नहीं खोल सका   "/logs/postgresql-2017-02-04_115222.log": अनुमति अस्वीकार कर दी गई

मैं भ्रामक कहता हूं, क्योंकि त्रुटि संदेश निर्देशिका को बताता है कंटेनर में वास्तव में निर्देशिका में, जब गलत अनुमति है मेजबान पर लेखन की अनुमति नहीं है।

मैंने मेजबान पर सही अनुमतियां सेट की हैं

chgroup ./logs docker && chmod 770 ./logs

41
2018-01-28 16:50



क्या आप stdout की बजाय फ़ाइल से पोस्टग्रेस लॉग बनाने और डॉकर लॉग कमांड का उपयोग करने की सलाह देंगे? में क्रॉसलिंकिंग के लिए kudos जिथूब मुद्दा ! - jpic
मुझे तय नहीं है कि फाइल करने या डॉकर लॉग का उपयोग करने के लिए लॉगिंग करना बेहतर है, जेपीआईसी। - Matthias Braun
आपने पासवर्ड जोड़ा है, जिसे आप शायद यहां मुखौटा करना चाहते हैं - vidstige
@ vidstige: मैं इस यादृच्छिक स्ट्रिंग को पासवर्ड के रूप में उपयोग नहीं करता, यह केवल प्रदर्शन के लिए है। - Matthias Braun


Postgres डॉकर कंटेनर में कस्टम postgresql.conf इंजेक्षन

डिफ़ॉल्ट postgresql.conf फ़ाइल के भीतर रहता है PGDATAडीआईआर (/var/lib/postgresql/data), जो चीजों को और अधिक जटिल बनाता है खासकर जब पहली बार पोस्टग्रेस कंटेनर चलाते हैं, तब से docker-entrypoint.sh रैपर ने आह्वान किया initdb के लिए कदम PGDATA डीआईआर प्रारंभिकरण।

डॉकर में लगातार पोस्टग्रेएसक्यूएल कॉन्फ़िगरेशन को कस्टमाइज़ करने के लिए, मैं उपयोग करने का सुझाव देता हूं config_file डॉकर वॉल्यूम के साथ पोस्टग्रेस विकल्प एक साथ:

उत्पादन डेटाबेस (पीजीडीएटीए डीआईआर लगातार वॉल्यूम के रूप में)

docker run -d \
-v $CUSTOM_CONFIG:/etc/postgresql.conf \
-v $CUSTOM_DATADIR:/var/lib/postgresql/data \
-e POSTGRES_USER=postgres \
-p 5432:5432 \
--name postgres \
postgres:9.6 postgres -c config_file=/etc/postgresql.conf

परीक्षण डेटाबेस (पीजीडीएटीए डीआईआर के बाद त्याग दिया जाएगा docker rm)

docker run -d \
-v $CUSTOM_CONFIG:/etc/postgresql.conf \
-e POSTGRES_USER=postgres \
--name postgres \
postgres:9.6 postgres -c config_file=/etc/postgresql.conf

डिबगिंग

  1. हटाए -d (अलग विकल्प) से docker run सीधे सर्वर लॉग देखने के लिए आदेश।
  2. Psql क्लाइंट के साथ पोस्टग्रेस सर्वर से कनेक्ट करें और कॉन्फ़िगरेशन से पूछें:

    docker run -it --rm --link postgres:postgres postgres:9.6 sh -c 'exec psql -h $POSTGRES_PORT_5432_TCP_ADDR -p $POSTGRES_PORT_5432_TCP_PORT -U postgres'
    
    psql (9.6.0)
    Type "help" for help.
    
    postgres=# SHOW all;
    

30
2017-11-14 21:29





जब आप आधिकारिक एंट्रीपॉइंट चलाते हैं (एके.ए. जब आप कंटेनर लॉन्च करते हैं), तो यह चलता है initdb में $PGDATA (/var/lib/postgresql/data डिफ़ॉल्ट रूप से), और फिर यह उस निर्देशिका में इन 2 फ़ाइलों को संग्रहीत करता है:

  • postgresql.conf डिफ़ॉल्ट मैनुअल सेटिंग्स के साथ।
  • postgresql.auto.conf सेटिंग स्वचालित रूप से overriden के साथ ALTER SYSTEM आदेश देता है।

एंट्रीपॉइंट भी किसी को निष्पादित करता है /docker-entrypoint-initdb.d/*.{sh,sql} फ़ाइलें।

इसका मतलब यह है कि आप उस फ़ोल्डर में एक खोल / एसक्यूएल स्क्रिप्ट की आपूर्ति कर सकते हैं जो अगले बूट के लिए सर्वर को कॉन्फ़िगर करता है (जो डीबी प्रारंभ के तुरंत बाद होगा, या अगली बार जब आप कंटेनर बूट करेंगे)।

उदाहरण:

conf.sql फ़ाइल:

ALTER SYSTEM SET max_connections = 6;
ALTER SYSTEM RESET shared_buffers;

Dockerfile फ़ाइल:

FROM posgres:9.6-alpine
COPY *.sql /docker-entrypoint-initdb.d/
RUN chmod a+r /docker-entrypoint-initdb.d/*

और फिर आपको निष्पादित करना होगा conf.sql मैन्युअल रूप से पहले से मौजूद डेटाबेस में मैन्युअल रूप से। चूंकि कॉन्फ़िगरेशन वॉल्यूम में संग्रहीत है, यह पुनर्निर्माण जीवित रहेगा।


पास करने का एक और विकल्प है -c जितनी बार चाहें ध्वज:

docker container run -d postgres -c max_connections=6 -c log_lock_waits=on

इस तरह आपको एक नई छवि बनाने की आवश्यकता नहीं है, और आपको पहले से मौजूद या डेटाबेस के बारे में परवाह करने की आवश्यकता नहीं है; सब प्रभावित होंगे।


20
2018-02-28 12:35



मुझे बचाया भाई धन्यवाद ! - You knows who
यह आखिरी वाला, पास-सी, मेरा पसंदीदा है। यह विभिन्न वातावरण के लिए उत्पन्न करने के लिए इतना साफ और सरल है। - epic_fil


आप अपना कस्टम डाल सकते हैं postgresql.conf कंटेनर के अंदर एक अस्थायी फ़ाइल में, और रनटाइम पर डिफ़ॉल्ट कॉन्फ़िगरेशन को ओवरराइट करें।

ऐसा करने के लिए :

  • अपनी कस्टम कॉपी करें postgresql.conf अपने कंटेनर के अंदर
  • कॉपी करें updateConfig.sh में फाइल /docker-entrypoint-initdb.d/

Dockerfile

FROM postgres:9.6

COPY postgresql.conf      /tmp/postgresql.conf
COPY updateConfig.sh      /docker-entrypoint-initdb.d/_updateConfig.sh

updateConfig.sh

#!/usr/bin/env bash

cat /tmp/postgresql.conf > /var/lib/postgresql/data/postgresql.conf

रनटाइम पर, कंटेनर स्क्रिप्ट को अंदर निष्पादित करेगा /docker-entrypoint-initdb.d/ और कस्टम एक के साथ डिफ़ॉल्ट विन्यास को ओवरराइट करें।


5
2017-09-05 10:09



दूसरी प्रति कमांड में "_" क्यों? यह नहीं होना चाहिए: /docker-entrypoint-initdb.d/updateConfig.sh ? - Fernando Castilla Ospina
ऐसा इसलिए है क्योंकि डॉकर-एंट्रीपॉइंट-initdb.d / फ़ोल्डर वर्णमाला क्रम में स्क्रिप्ट निष्पादित करता है। और मैं दूसरों के सामने इस स्क्रिप्ट को लागू करना चाहता हूं। - alphayax
tnx मैं भूल गया कि कॉपी ने अंडरस्कोर का उपयोग करने के लिए फ़ाइल का नाम बदल दिया - Fernando Castilla Ospina


इस समस्या का एक काफी कम तकनीक समाधान सेवा घोषित करने के लिए प्रतीत होता है (मैं एडब्ल्यूएस और एक यमल फ़ाइल पर झुंड का उपयोग कर रहा हूं) आपकी डेटाबेस फ़ाइलों को एक सतत मात्रा में घुमाया गया है (यहां क्लाउडस्टोर द्वारा बताए गए एडब्ल्यूएस ईएफएस: aws ड्राइवर विनिर्देश)।

  version: '3.3'
  services:
    database:
      image: postgres:latest
      volumes:
        - postgresql:/var/lib/postgresql
        - postgresql_data:/var/lib/postgresql/data
    volumes:
       postgresql:
         driver: "cloudstor:aws" 
       postgresql_data:
         driver: "cloudstor:aws"
  1. डीबी छवि डिफ़ॉल्ट सेटिंग्स के साथ शुरू के रूप में आता है।
  2. आप कंटेनर के अंदर conf सेटिंग्स को संपादित करते हैं, उदाहरण के लिए यदि आप अधिकतम संख्या में समवर्ती कनेक्शन को बढ़ाना चाहते हैं जिसके लिए पुनरारंभ करना आवश्यक है
  3. चलने वाले कंटेनर को रोकें (या सेवा को शून्य पर स्केल करें और फिर एक पर वापस जाएं)
  4. झुंड एक नया कंटेनर पैदा करता है, जो इस बार आपके लगातार कॉन्फ़िगरेशन सेटिंग्स को उठाता है और उन्हें लागू करता है।

आपकी कॉन्फ़िगरेशन को बनाए रखने का एक सुखद दुष्प्रभाव यह है कि यह आपके डेटाबेस को भी जारी रखता है (या यह दूसरी तरफ था) ;-)


2
2017-10-27 12:50





मैंने सभी उत्तरों को देखा और एक और विकल्प बाकी है। आप अपने सीएमडी मान को डॉकर फ़ाइल में बदल सकते हैं (यह सबसे अच्छा नहीं है, लेकिन आपका लक्ष्य प्राप्त करने के लिए अभी भी संभव तरीका है)।

असल में हमें जरूरत है

  • डॉकर कंटेनर में कॉन्फ़िगरेशन फ़ाइल कॉपी करें
  • पोस्टग्रेस स्टार्ट विकल्प ओवरराइड करें

डॉकर फ़ाइल उदाहरण:

FROM postgres:9.6
USER postgres

# Copy postgres config file into container
COPY postgresql.conf /etc/postgresql

# Override default postgres config file
CMD ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]

हालांकि मैं सोच रहा हूँ command: postgres -c config_file=/etc/postgresql/postgresql.confआपके में docker-compose.yml द्वारा प्रस्तावित फ़ाइल Matthias Braun सबसे अच्छा विकल्प है।


1
2018-03-12 05:50