如何定制PostgreSQL Docker官方镜像的配置文件?

如何定制PostgreSQL Docker官方镜像的配置文件?,postgresql,docker,Postgresql,Docker,我正在使用尝试自定义其配置。为此,我使用命令sed来更改max\u连接,例如: sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf 我尝试了两种方法来应用此配置。第一种方法是将命令添加到脚本中,并将其复制到init文件夹“/docker entrypoint initdb.d”中。第二种方法是使用“RUN”命令直接在Dockerfile中运

我正在使用尝试自定义其配置。为此,我使用命令
sed
来更改
max\u连接
,例如:

sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf
我尝试了两种方法来应用此配置。第一种方法是将命令添加到脚本中,并将其复制到init文件夹“/docker entrypoint initdb.d”中。第二种方法是使用“RUN”命令直接在Dockerfile中运行它们(该方法适用于非官方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"]
#数据库(http://www.cs3c.ma/)
博士后:9.4
维护者萨班尼
环境术语=xterm
运行apt获取更新
运行apt获取安装-y nano
添加脚本/脚本
#添加脚本/setup-my-schema.sh/docker entrypoint initdb.d/
#允许从任何地方进行连接。
运行sed-i-e“s/^#listen#addresses=.*$/listen#addresses='*'/'”/var/lib/postgresql/data/postgresql.conf
运行echo“host all 0.0.0.0/0 md5”>/var/lib/postgresql/data/pg_hba.conf
#配置日志
运行sed-i-e“s/^#logging_collector=off.$/logging_collector=on/”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^#log#u directory='pg#u log'.*$/log#u directory='\/var\/log\/postgresql'/'”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^#log#u filename='postgresql-\%Y-\%m-\%d\%H\%m\%s.log.*$/log#u filename='postgresql\%a.log'/'”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^#log#u file_mode=0600.*$/log_file_mode=0644/”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^#log_truncate_on_rotation=off.$/log_truncate_on_rotation=on/”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^#log#u rotation_age=1d.*$/log_rotation_age=1d/”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^#log#u min_duration_statement=-1.*$/log_min_duration_statement=0/”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^#log#u checkpoints=off.$/log#u checkpoints=on/”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^#log#u connections=off.*$/log#u connections=on/”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^#log#u disconnections=off.*$/log#u disconnections=on/”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^log\u line\u prefix='\%t\[\%p-\%l\]\%q\%u\%d'.*$/log\u line\u prefix='\%t\[\%p\]:\[\%l-1\]user=\%u,db=\%d'/“/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^#log_lock_waits=off.*$/log_lock_waits=on/”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^#log#temp_files=-1.*$/log_temp_files=0/”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^#statement#u timeout=0.*$/statement#u timeout=1800000#在毫秒内,0被禁用(当前30分钟)/”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^lc_messages='en_US.UTF-8'.*$/lc_messages='C'/'/var/lib/postgresql/data/postgresql.conf
#性能调整
运行sed-i-e“s/^max\u connections=100.*$/max\u connections=1000/”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^shared\u buffers=.*$/shared\u buffers=16GB/”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^#effective_cache_size=128MB.$/effective_cache_size=48GB/”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^#work_mem=1MB.$/work_mem=16MB/”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^#maintenance_-work_-mem=16MB.$/maintenance_-work_-mem=2GB/”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^#checkpoint_segments=.*$/checkpoint_segments=32/”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^#checkpoint_completion_target=0.5.*$/checkpoint_completion_target=0.7/”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^#wal#u buffers=.*$/wal#u buffers=16MB/”/var/lib/postgresql/data/postgresql.conf
运行sed-i-e“s/^#default_statistics_target=100.*$/default_statistics_target=100/”/var/lib/postgresql/data/postgresql.conf
卷[“/var/lib/postgresql/data”,“/var/log/postgresql”]
CMD[“postgres”]

使用此Dockerfile,构建过程将显示错误:
sed:can't read/var/lib/postgresql/data/postgresql.conf:没有这样的文件或目录

您从中继承的
postgres:9.4
图像在
/var/lib/postgresql/data
声明了一个卷。这本质上意味着您不能将任何文件复制到图像中的该路径;这些更改将被丢弃

您有几个选择:

  • 您可以在运行时使用
    docker run-v postgresql.conf:/var/lib/postgresql/data/postgresql.conf…
    将自己的配置文件添加为卷。但是,我不确定它将如何与现有卷交互

  • 您可以在容器启动时复制文件。要做到这一点,请将文件复制到构建中不在卷下面的位置,然后从入口点或cmd调用脚本,将文件复制到正确的位置并启动postgres

  • 克隆Postgres官方映像后面的项目,并编辑Dockerfile以在声明卷之前添加您自己的配置文件(在运行时自动复制卷指令之前添加的任何内容)

  • 在docker compose文件的命令选项中传递所有配置更改

比如:

将自定义postgresql.conf注入postgres Docker容器 默认的
postgresql.conf
文件位于
PGDATA
目录(
/var/lib/postgresql/data
)中,这使得事情更加复杂,尤其是在第一次运行postgres容器时,因为
docker entrypoint.sh
包装器为
PGDATA调用
initdb
步骤<
services:
  postgres:
    ...  
    command:
      - "postgres"
      - "-c"
      - "max_connections=1000"
      - "-c"
      - "shared_buffers=3GB"
      - "-c"
      ...
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 run -d \
-v $CUSTOM_CONFIG:/etc/postgresql.conf \
-e POSTGRES_USER=postgres \
--name postgres \
postgres:9.6 postgres -c config_file=/etc/postgresql.conf
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;
command: postgres -c logging_collector=on -c log_destination=stderr -c log_directory=/logs
command: postgres -c config_file=/etc/postgresql.conf
volumes:
   - ./customPostgresql.conf:/etc/postgresql.conf
chgroup ./logs docker && chmod 770 ./logs
ALTER SYSTEM SET max_connections = 6;
ALTER SYSTEM RESET shared_buffers;
FROM posgres:9.6-alpine
COPY *.sql /docker-entrypoint-initdb.d/
RUN chmod a+r /docker-entrypoint-initdb.d/*
docker container run -d postgres -c max_connections=6 -c log_lock_waits=on
FROM postgres:9.6

COPY postgresql.conf      /tmp/postgresql.conf
COPY updateConfig.sh      /docker-entrypoint-initdb.d/_updateConfig.sh
#!/usr/bin/env bash

cat /tmp/postgresql.conf > /var/lib/postgresql/data/postgresql.conf
  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"
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"]
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
CREATE EXTENSION pg_cron;
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
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"]
SHOW config_file;
docker ps -a
...
0ba35e5427d9    postgres    "docker-entrypoint.s…" ....
...
docker exec -it 0ba35e5427d9 /bin/bash
cat /data/postgres/postgresql.conf
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
cd /usr/lib/postgresql/
ls 
su - postgres -c "PGDATA=$PGDATA /usr/lib/postgresql/12/bin/pg_ctl -w restart"