วิธีปรับแต่งไฟล์คอนฟิกของอิมเมจ PostgreSQL Docker อย่างเป็นทางการ


107

ฉันใช้อิมเมจ Postgres Docker อย่างเป็นทางการเพื่อพยายามปรับแต่งการกำหนดค่า เพื่อจุดประสงค์นี้ฉันใช้คำสั่งsedเพื่อเปลี่ยนแปลงmax_connectionsตัวอย่างเช่น:

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

ฉันลองสองวิธีเพื่อใช้การกำหนดค่านี้ ขั้นแรกคือการเพิ่มคำสั่งลงในสคริปต์และคัดลอกภายในโฟลเดอร์ init "/docker-entrypoint-initdb.d" วิธีที่สองคือการเรียกใช้โดยตรงภายใน Dockerfile ของฉันด้วยคำสั่ง "RUN" (วิธีนี้ใช้ได้ดีกับอิมเมจ Postgresql ที่ไม่เป็นทางการโดยใช้พา ธ อื่นไปยังไฟล์คอนฟิกูเรชัน "/ etc / postgres / ... ") ในทั้งสองกรณีการเปลี่ยนแปลงล้มเหลวเนื่องจากไม่มีไฟล์การกำหนดค่า (ฉันคิดว่ายังไม่ได้สร้าง)

ฉันจะเปลี่ยนการกำหนดค่าได้อย่างไร?

แก้ไข 1:

นี่คือ Dockerfile ที่ใช้สร้างอิมเมจ:

# 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"]

ด้วย Dockerfile นี้กระบวนการสร้างจะแสดงข้อผิดพลาด: sed: can't read /var/lib/postgresql/data/postgresql.conf: No such file or directory


1
วิธีหนึ่งคือใช้อิมเมจอย่างเป็นทางการเริ่มต้นเชื่อมต่อภายในdocker exec -it container_id bashจากนั้นทำการปรับเปลี่ยนจากนั้นdocker commit container_id myuser/myimage_myPostegresql:myversionดู doc docs.docker.com/reference/commandline/cli/#commit
user2915097

2
ฉันคิดว่าข้อดีอย่างหนึ่งของกระบวนทัศน์นักเทียบท่าคือการทำให้กระบวนการสร้างทั้งหมดเป็นไปโดยอัตโนมัติ ตามที่กล่าวไว้ในรูปภาพอื่นpaintedfox/postgresqlคุณสามารถเปลี่ยนการกำหนดค่าได้โดยตรงภายใน Dockerfile ฉันคิดว่าน่าจะเป็นไปได้ด้วยภาพที่เป็นทางการ
Sakr

วิธีการ sed ควรใช้งานได้คุณสามารถโพสต์ Dcokerfile ของคุณหรือตัวทำซ้ำที่สมบูรณ์ได้หรือไม่?
user2915097

คำตอบ:


58

ภาพที่คุณได้รับมรดกมาจากประกาศปริมาณที่postgres:9.4 /var/lib/postgresql/dataโดยพื้นฐานแล้วหมายความว่าคุณไม่สามารถคัดลอกไฟล์ใด ๆ ไปยังเส้นทางนั้นในรูปภาพของคุณได้ การเปลี่ยนแปลงจะถูกยกเลิก

คุณมีทางเลือกไม่กี่ทาง:

  • คุณสามารถเพิ่มไฟล์การกำหนดค่าของคุณเองเป็นไดรฟ์ข้อมูลในขณะทำงานด้วยdocker run -v postgresql.conf:/var/lib/postgresql/data/postgresql.conf ...ไฟล์. อย่างไรก็ตามฉันไม่แน่ใจว่าจะโต้ตอบกับไดรฟ์ข้อมูลที่มีอยู่อย่างไร

  • คุณสามารถคัดลอกไฟล์เมื่อคอนเทนเนอร์เริ่มทำงาน ในการทำเช่นนั้นให้คัดลอกไฟล์ของคุณไปยังบิลด์ในตำแหน่งที่ไม่อยู่ใต้ไดรฟ์ข้อมูลจากนั้นเรียกสคริปต์จากจุดเข้าใช้งานหรือ cmd ซึ่งจะคัดลอกไฟล์ไปยังตำแหน่งที่ถูกต้องและเริ่ม postgres

  • โคลนโปรเจ็กต์ที่อยู่ด้านหลังอิมเมจทางการของ Postgres และแก้ไข Dockerfile เพื่อเพิ่มไฟล์ config ของคุณเองก่อนที่จะประกาศ VOLUME (สิ่งที่เพิ่มไว้ก่อนคำสั่ง VOLUME จะถูกคัดลอกโดยอัตโนมัติในขณะรันไทม์)

  • ส่งผ่านการเปลี่ยนแปลงการกำหนดค่าทั้งหมดในตัวเลือกคำสั่งในไฟล์ docker-compose

ชอบ:

services:
  postgres:
    ...  
    command:
      - "postgres"
      - "-c"
      - "max_connections=1000"
      - "-c"
      - "shared_buffers=3GB"
      - "-c"
      ...

4
นั่นคือการเปลี่ยนแปลงไม่ควรอยู่ใน Dockerfile ฉันได้ย้ายไปยังสคริปต์และเรียกมันจากจุดเข้าใช้งานและตอนนี้ก็ใช้งานได้ดี ขอบคุณสำหรับคำตอบ
Sakr

5
ฉันเพิ่งคัดลอกสคริปต์ภายในโฟลเดอร์ init "/docker-entrypoint-initdb.d/" และก็ใช้งานได้ดีในครั้งนี้ มันแปลก แต่ดูเหมือนว่าฉันให้ความสำคัญกับการตั้งค่าภาพด้วย Dockerfile อย่างที่ฉันคุ้นเคยกับภาพส่วนใหญ่ที่ฉันพลาดบางอย่างเมื่อลองครั้งแรกโดยใช้สคริปต์ init
Sakr

"โดยพื้นฐานแล้วหมายความว่าคุณไม่สามารถคัดลอกไฟล์ใด ๆ ไปยังเส้นทางนั้นในภาพของคุณการเปลี่ยนแปลงจะถูกละทิ้ง" คุณช่วยอธิบายได้ไหมว่าทำไมถึงเป็นเช่นนั้น
isco

@isco ค้นหาปริมาณในเอกสารอย่างเป็นทางการ โดยทั่วไปไดรฟ์ข้อมูลจะไม่ถูกเก็บไว้ในรูปภาพ แต่อยู่บนโฮสต์ดังนั้นข้อมูลจะถูกบันทึกไว้ในโฮสต์ไม่ใช่ในรูปภาพ คุณต้องเริ่มคอนเทนเนอร์ด้วยไดรฟ์ข้อมูลเดียวกันที่แนบมาเพื่อเก็บข้อมูล
Adrian Mouat

ฉันเปลี่ยนใน /var/lib/postgres/data/pg_hba.conf สำหรับยอมรับการเชื่อมต่อเท่านั้นคือโฮสต์ทั้งหมด 192.168.0.0/0 md5 และโฮสต์ความคิดเห็นทั้งหมดทั้งหมด md5 ทั้งหมด (เป็นค่าเริ่มต้น) แต่อย่าเปลี่ยนเอฟเฟกต์
Lucas Resende

85

ด้วย Docker Compose

เมื่อทำงานกับ Docker Compose คุณสามารถใช้command: postgres -c option=valueในdocker-compose.ymlการกำหนดค่า Postgres ได้

ตัวอย่างเช่นสิ่งนี้ทำให้ 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

ในการเปลี่ยนไฟล์กำหนดค่า Postgres จะใช้ คุณจะติดตั้งไฟล์กำหนดค่าที่กำหนดเองด้วยไดรฟ์ข้อมูล:

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

นี่คือdocker-compose.ymlแอปพลิเคชันของฉันที่แสดงวิธีกำหนดค่า Postgres:

# 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:

สิทธิ์ในการเขียนลงในไดเร็กทอรีบันทึก

โปรดทราบว่าเมื่ออยู่บน Linux ไดเร็กทอรีบันทึกบนโฮสต์ต้องมีสิทธิ์ที่ถูกต้อง มิฉะนั้นคุณจะได้รับข้อผิดพลาดเล็กน้อยที่ทำให้เข้าใจผิด

FATAL: ไม่สามารถเปิดไฟล์บันทึก "/logs/postgresql-2017-02-04_115222.log": การอนุญาตถูกปฏิเสธ

ฉันพูดว่าทำให้เข้าใจผิดเนื่องจากข้อความแสดงข้อผิดพลาดแสดงให้เห็นว่าไดเร็กทอรีในคอนเทนเนอร์มีการอนุญาตที่ไม่ถูกต้องในความเป็นจริงไดเร็กทอรีบนโฮสต์ไม่อนุญาตให้เขียน

ในการแก้ไขปัญหานี้ฉันตั้งค่าการอนุญาตที่ถูกต้องบนโฮสต์โดยใช้

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

คุณจะแนะนำให้ทำการบันทึก postgres เป็นไฟล์แทนที่จะใช้ stdout และใช้คำสั่ง docker logs เพื่อจัดการกับมัน ความรุ่งโรจน์สำหรับการเชื่อมขวางในปัญหา Github !
jpic

1
ฉันไม่ได้ตัดสินใจว่าจะล็อกไฟล์หรือใช้ Docker logs ดีกว่า jpic
Matthias Braun

คุณได้เพิ่มรหัสผ่านซึ่งคุณอาจต้องการปิดบังไว้ที่นี่
vidstige

3
@vidstige: ฉันไม่ได้ใช้สตริงสุ่มนี้เป็นรหัสผ่านมันใช้เพื่อการสาธิตเท่านั้น
Matthias Braun

1
@Gherman: คุณเพิ่มสิ่งนี้ลงใน Dockerfile หรือไม่? เพราะคุณไม่ควร คำตอบของฉันใช้docker-compose.yml.
Matthias Braun

40

ใส่ postgresql.conf ที่กำหนดเองลงในคอนเทนเนอร์ของ Postgres Docker

postgresql.confไฟล์ดีฟอลต์อยู่ภายในPGDATAdir ( /var/lib/postgresql/data) ซึ่งทำให้สิ่งต่าง ๆ ซับซ้อนมากขึ้นโดยเฉพาะเมื่อเรียกใช้ postgres container เป็นครั้งแรกเนื่องจากdocker-entrypoint.shwrapper เรียกใช้initdbขั้นตอนสำหรับการPGDATAเริ่มต้น dir

ในการปรับแต่งการกำหนดค่า PostgreSQL ใน Docker อย่างสม่ำเสมอฉันขอแนะนำให้ใช้config_fileตัวเลือก postgres ร่วมกับไดรฟ์ข้อมูล Docker ดังนี้:

ฐานข้อมูลการผลิต (PGDATA dir เป็น Persistent Volume)

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

ฐานข้อมูลการทดสอบ (PGDATA dir จะถูกทิ้งหลังจากนั้น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(detach option) ออกจากdocker runคำสั่งเพื่อดูบันทึกเซิร์ฟเวอร์โดยตรง
  2. เชื่อมต่อกับเซิร์ฟเวอร์ postgres ด้วยไคลเอนต์ 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

เมื่อคุณเรียกใช้จุดเข้าใช้งานอย่างเป็นทางการ (AKA เมื่อคุณเปิดใช้งานคอนเทนเนอร์) มันจะทำงานinitdbใน$PGDATA( /var/lib/postgresql/dataโดยค่าเริ่มต้น) จากนั้นจะเก็บไว้ในไดเร็กทอรีนั้น 2 ไฟล์:

  • postgresql.conf ด้วยการตั้งค่าเริ่มต้นด้วยตนเอง
  • postgresql.auto.confด้วยการตั้งค่าจะลบล้างโดยอัตโนมัติด้วยALTER SYSTEMคำสั่ง

จุดเข้าใช้งานยังเรียกใช้/docker-entrypoint-initdb.d/*.{sh,sql}ไฟล์ใด ๆ

ทั้งหมดนี้หมายความว่าคุณสามารถใส่เชลล์ / สคริปต์ SQL ในโฟลเดอร์นั้นที่กำหนดค่าเซิร์ฟเวอร์สำหรับการบูตครั้งต่อไป (ซึ่งจะเกิดขึ้นทันทีหลังจากการเริ่มต้น DB หรือในครั้งถัดไปที่คุณบูตคอนเทนเนอร์)

ตัวอย่าง:

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

ด้วยวิธีนี้คุณไม่จำเป็นต้องสร้างภาพใหม่และคุณไม่จำเป็นต้องสนใจเกี่ยวกับฐานข้อมูลที่มีอยู่แล้วหรือไม่มีฐานข้อมูล ทั้งหมดจะได้รับผลกระทบ


2
อันสุดท้ายนี้ผ่าน -c เป็นรายการโปรดของฉัน สิ่งนี้สะอาดและง่ายมากในการสร้างสำหรับสภาพแวดล้อมที่แตกต่างกัน
epic_fil

10

คุณสามารถใส่แบบกำหนดเอง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/และเขียนทับการกำหนดค่าเริ่มต้นด้วยการกำหนดค่าที่คุณกำหนดเอง


ทำไม "_" ในคำสั่งสำเนาที่สอง ไม่ควร: /docker-entrypoint-initdb.d/updateConfig.sh?
Fernando Castilla Ospina

3
เป็นเพราะ docker-entrypoint-initdb.d / โฟลเดอร์เรียกใช้สคริปต์ตามลำดับตัวอักษร และฉันต้องการใช้สคริปต์นี้ก่อนบทอื่น ๆ
alphayax

tnx ฉันลืมไปว่าสำเนาเปลี่ยนชื่อไฟล์เพื่อใช้ขีดล่าง
Fernando Castilla Ospina

10

ฉันดูคำตอบทั้งหมดและมีตัวเลือกอื่นที่เหลืออยู่ คุณสามารถเปลี่ยนค่า CMD ของคุณในไฟล์นักเทียบท่าได้ (ไม่ใช่วิธีที่ดีที่สุด แต่ก็ยังเป็นไปได้ในการบรรลุเป้าหมายของคุณ)

โดยพื้นฐานแล้วเราต้อง

  • คัดลอกไฟล์กำหนดค่าในคอนเทนเนอร์นักเทียบท่า
  • แทนที่ตัวเลือกการเริ่ม postgres

ตัวอย่างไฟล์ Docker:

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เสนอเป็นตัวเลือกที่ดีที่สุด


2

วิธีแก้ปัญหาที่ค่อนข้างใช้เทคโนโลยีต่ำสำหรับปัญหานี้ดูเหมือนจะเป็นการประกาศบริการ (ฉันใช้ swarm บน AWS และไฟล์ yaml) กับไฟล์ฐานข้อมูลของคุณที่ติดตั้งกับไดรฟ์ข้อมูลที่คงอยู่ (ที่นี่ AWS EFS แสดงโดย cloudstor: ไดรเวอร์ 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

วิธีแก้ปัญหาของฉันมีไว้สำหรับเพื่อนร่วมงานที่ต้องทำการเปลี่ยนแปลงใน config ก่อนที่จะเรียกใช้ docker-entrypoint-initdb.d

ฉันจำเป็นต้องเปลี่ยนการตั้งค่า 'shared_preload_libraries' ดังนั้นในระหว่างการทำงาน postgres มีไลบรารีใหม่ที่โหลดไว้ล่วงหน้าแล้วและโค้ดใน docker-entrypoint-initdb.d สามารถใช้งานได้

ดังนั้นฉันเพิ่งแก้ไขไฟล์ postgresql.conf.sample ใน Dockerfile:

RUN echo "shared_preload_libraries='citus,pg_cron'" >> /usr/share/postgresql/postgresql.conf.sample
RUN echo "cron.database_name='newbie'" >> /usr/share/postgresql/postgresql.conf.sample

และด้วยแพตช์นี้ทำให้สามารถเพิ่มนามสกุลในไฟล์. sql ใน docker-entrypoint-initdb.d /:

CREATE EXTENSION pg_cron;

2

สิ่งนี้ใช้ได้กับฉัน:

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"]

เหตุใดจึงไม่ได้รับคะแนนโหวตเพิ่ม มันเป็นเรื่องที่ดีที่สุดที่นี่ ... ขอบคุณ
ไถ

0

postgresql.auto.confใช้นักเทียบท่าเขียนคุณสามารถติดตั้งไดรฟ์ด้วย ตัวอย่าง:

version: '2'

services:
  db:
    image: postgres:10.9-alpine
    volumes:
      - postgres:/var/lib/postgresql/data:z
      - ./docker/postgres/postgresql.auto.conf:/var/lib/postgresql/data/postgresql.auto.conf
    ports:
      - 5432:5432

คุณไม่ควรแก้ไขpostgresql.auto.confเนื่องจากมีการเขียนทับ ใช้postgresql.confที่ตำแหน่งเดียวกัน
Baschdl

0

ฉันยังใช้อิมเมจอย่างเป็นทางการ ( FROM postgres) และฉันสามารถเปลี่ยนการกำหนดค่าได้โดยดำเนินการคำสั่งต่อไปนี้

สิ่งแรกคือการค้นหาไฟล์กำหนดค่า PostgreSQL สามารถทำได้โดยดำเนินการคำสั่งนี้ในฐานข้อมูลที่กำลังทำงานอยู่

SHOW config_file;

ฉันคืนเคสของฉัน /data/postgres/postgresql.confผมของฉันกรณีที่ผลตอบแทน

ขั้นตอนต่อไปคือการค้นหาว่าอะไรคือแฮชของคอนเทนเนอร์นักเทียบท่า PostgreSQL ของคุณ

docker ps -a

สิ่งนี้ควรส่งคืนรายการคอนเทนเนอร์ที่กำลังทำงานอยู่ทั้งหมด ในกรณีของฉันดูเหมือนว่านี้

...
0ba35e5427d9    postgres    "docker-entrypoint.s…" ....
...

ตอนนี้คุณต้องเปลี่ยนไปใช้ bash ภายในคอนเทนเนอร์ของคุณโดยดำเนินการ:

docker exec -it 0ba35e5427d9 /bin/bash

ภายในคอนเทนเนอร์ตรวจสอบว่าการกำหนดค่าอยู่ในเส้นทางที่ถูกต้องหรือไม่และแสดง

cat /data/postgres/postgresql.conf

ฉันต้องการเปลี่ยนการเชื่อมต่อสูงสุดจาก 100 เป็น 1,000 และบัฟเฟอร์ที่แชร์จาก 128MB เป็น 3GB ด้วยคำสั่ง sed ฉันสามารถค้นหาและแทนที่ด้วยตัวแปรที่เกี่ยวข้องใน config

sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /data/postgres/postgresql.conf
sed -i -e"s/^shared_buffers = 128MB.*$/shared_buffers = 3GB/" /data/postgres/postgresql.conf

สิ่งสุดท้ายที่เราต้องทำคือการรีสตาร์ทฐานข้อมูลภายในคอนเทนเนอร์ ค้นหาว่าคุณใช้ PostGres เวอร์ชันใดอยู่

cd /usr/lib/postgresql/
ls 

ในกรณีของฉัน12 ตอนนี้คุณสามารถรีสตาร์ทฐานข้อมูลได้โดยดำเนินการคำสั่งต่อไปนี้พร้อมกับเวอร์ชันที่ถูกต้อง

su - postgres -c "PGDATA=$PGDATA /usr/lib/postgresql/12/bin/pg_ctl -w restart"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.