我正在使用官方的postgresql docker镜像(版本9.4)。我已经扩展了Dockerfile,所以我可以使用bash脚本更改postgresql.conf等中的设置。 它成功地在入口点上添加并运行脚本,用于单个sed命令。但是当我输入2个或更多sed命令时,我收到以下错误:
/docker-entrypoint.sh:正在运行/docker-entrypoint-initdb.d/config.sh
:没有这样的文件或directoryread /var/lib/postgresql/data/postgresql.conf
我正在尝试在Windows 10上与Vagrant和VirtualBox结合使用,通过vagrant-winnfsd插件在共享文件夹上使用NFS文件系统。
为什么会这样?如何更改我的bash脚本以使用更多配置设置?有没有更好的办法?
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"
答案 0 :(得分:1)
您可能想尝试使用RUN
语句来执行bash脚本,或者只使用两个命令与分号结合直接运行sed:
RUN sed -i -e 's/^#\(logging_collector = \).*/\1on/; s/^\(max_connections = \).*/\11000/' \
/var/lib/postgresql/data/postgresql.conf
更具可扩展性的解决方案是将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/
答案 1 :(得分:-1)
似乎是How to customize the configuration file of the official PostgreSQL docker image?的副本。
在https://stackoverflow.com/a/40598124/385548复制粘贴我的答案。
默认postgresql.conf
文件位于PGDATA
目录(/var/lib/postgresql/data
)内,这使得事情变得更加复杂,尤其是第一次运行postgres容器时,因为docker-entrypoint.sh
包装器调用initdb
dir初始化的PGDATA
步骤。
要在Docker中一致地自定义PostgreSQL配置,我建议将config_file
postgres选项与Docker卷一起使用,如下所示:
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
-d
命令中删除docker run
(分离选项)以直接查看服务器日志。使用psql客户端连接到postgres服务器并查询配置:
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;