Mik*_*art 2 postgresql docker docker-compose
我想为 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
Run Code Online (Sandbox Code Playgroud)
使用包含以下内容的撰写文件:
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
Run Code Online (Sandbox Code Playgroud)
这不起作用,我认为这是因为配置文件在图像内被修改,但整个 PGSQL 文件夹被撰写文件中的卷屏蔽。
我认为你可以在不创建衍生图像的情况下做到这一点。
当 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
Run Code Online (Sandbox Code Playgroud)
可以看出,它会盲目地运行这个目录中的任何脚本,无论是.shshell脚本,还是.sql/ .sql.gzsql脚本。
将所有这些放在一起,您可以在您的 中将docker-compose.yml本地文件夹(包含一个名为 的 shell 脚本startup.sh)映射到/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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)