我想为PostgreSQL创建一个自定义Docker镜像,它将使用主机的文件系统来存储数据库文件。
我还需要调整此映像以覆盖默认的PGSQL配置,以便能够从任何IP访问数据库。这纯粹是为了开发环境,因此没有安全担忧或问题。
我知道如何使用本地文件系统,我知道如何将文件从主机添加到容器中。我不知道如何在同一个图像/容器中完成这两件事。
我尝试使用Dockerfile:
FROM postgres:9.6.8
RUN echo "host all all 0.0.0.0/0 trust" >> /var/lib/postgresql/data/pg_hba.conf
RUN echo "listen_addresses='*'" >> /var/lib/postgresql/data/postgresql.conf
使用包含以下内容的撰写文件:
version: "2"
services:
db:
image: "test-pgsql:latest"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgress
- POSTGRES_DB=postgres
ports:
- "5433:5432"
volumes:
- /var/lib/postgresql/data:/var/lib/postgresql/data
这不起作用,我认为这是因为配置文件在图像内被修改,但整个PGSQL文件夹被组成文件中的卷屏蔽。
答案 0 :(得分:2)
我认为你可以在不创建衍生图像的情况下做到这一点。
当postgres图像开始时,它会运行docker-entrypoint.sh
(这是图像的一部分)。
此启动例程的一部分运行文件夹docker-entrypoint-initdb.d
for f in /docker-entrypoint-initdb.d/*; do
case "$f" in
*.sh) echo "$0: running $f"; . "$f" ;;
*.sql) echo "$0: running $f"; "${psql[@]}" -f "$f"; echo ;;
*.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${psql[@]}"; echo ;;
*) echo "$0: ignoring $f" ;;
esac
echo
done
可以看出,它将盲目地运行此目录中的任何脚本,该脚本是.sh
shell脚本或.sql
/ .sql.gz
sql脚本。
综上所述,您可以在docker-compose.yml
中将本地文件夹(包含名为startup.sh
的shell脚本)映射到/docker-entrypoint-initdb.d
:
startup.sh
(您可能需要添加警卫以防止重复附加到conf文件)
echo "host all all 0.0.0.0/0 trust" >> /var/lib/postgresql/data/pg_hba.conf
echo "listen_addresses='*'" >> /var/lib/postgresql/data/postgresql.conf
<强> docker-compose.yml
强>
db:
image: postgres:9.6.8
restart: always
environment:
- SOMESTUFF=something
ports:
- "5433:5432"
volumes:
- /var/lib/postgresql/data:/var/lib/postgresql/data
- ${PWD}/postgresdocker/dbscripts/:/docker-entrypoint-initdb.d