自定义PostgreSQL官方镜像的configuration

我正在使用官方的postgresql docker镜像(版本9.4)。 我扩展了Dockerfile,所以我可以使用bash脚本来改变postgresql.conf等中的设置。 它成功地添加并运行入口点上的脚本,用于单个sed命令 。 但是当我把2个或更多的sed命令,我得到以下错误:

/docker-entrypoint.sh:运行/docker-entrypoint-initdb.d/config.sh
:没有这样的文件或目录读取/var/lib/postgresql/data/postgresql.conf

我正在试用Windows 10,结合Vagrant和VirtualBox,在共享文件夹上使用NFS文件系统,通过vagrant-winnfsd插件。

为什么发生这种情况? 我怎样才能改变我的bash脚本,以使用更多的configuration设置? 有没有更好的办法?

Dockerfile:

FROM postgres:9.4 RUN echo "Europe/Athens" > /etc/timezone \ && dpkg-reconfigure -f noninteractive tzdata RUN localedef -i el_GR -c -f UTF-8 -A /usr/share/locale/locale.alias el_GR.UTF-8 ADD config.sh /docker-entrypoint-initdb.d/ RUN chmod 755 /docker-entrypoint-initdb.d/config.sh VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"] 

config.sh:

 #!/bin/bash sed -i -e"s/^#logging_collector = off.*$/logging_collector = on/" /var/lib/postgresql/data/postgresql.conf sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf 

database.yml的

 postgres: container_name: postgres-9.4 image: ***/postgres-9.4 volumes_from: - postgres_data ports: - 5432:5432 environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=password - POSTGRES_DB=database - USERMAP_UID=999 - USERMAP_GID=999 postgres_data: container_name: postgres_data image: ***/postgres-9.4 volumes: - ./services/postgres:/etc/postgresql - ./services/postgres:/var/lib/postgresql - ./services/postgres/logs:/var/log/postgresql command: "true" 

您可能想要尝试使用RUN语句来执行您的bash脚本,或者直接使用两个分号结合的命令直接运行sed:

 RUN sed -i -e 's/^#\(logging_collector = \).*/\1on/; s/^\(max_connections = \).*/\11000/' \ /var/lib/postgresql/data/postgresql.conf 

更具扩展性的解决scheme是将sed程序放在外部文件中,然后使用以下语句:

 ADD postgres-edit.sed /var/local RUN sed -i -f /var/local/postgres-edit.sed /var/lib/postgresql/data/postgresql.conf 

Postgres的-edit.sed:

 # sed script to edit postgresql configuration s/^#\(logging_collector = \).*/\1on/ s/^\(max_connections = \).*/\11000/ 

看起来像是重复的如何自定义PostgreSQL官方镜像的configuration文件? 。

复制粘贴我的答案在https://stackoverflow.com/a/40598124/385548


将自定义postgresql.conf注入到postgres Docker容器中

默认的postgresql.conf文件位于PGDATA目录( /var/lib/postgresql/data )中,这使得事情更加复杂,尤其是在第一次运行postgres容器时,因为docker-entrypoint.sh包装器调用initdb步骤PGDATA目录初始化。

要一致地定制Docker中的PostgreSQLconfiguration,我build议使用config_file postgres选项和Docker卷一起使用:

生产数据库(PGDATA目录作为持续卷)

 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 

testing数据库(在docker rm之后,将丢弃PGDATA目录)

 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 

debugging

  1. docker run命令中除去-d (detach选项)以直接查看服务器日志。
  2. 用psql客户端连接到postgres服务器并查询configuration:

     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;