gpt4 book ai didi

postgresql - 自定义 PostgreSQL 并修改了配置文件和存储在主机文件系统上的数据库文件?

转载 作者:行者123 更新时间:2023-11-29 12:08:19 25 4
gpt4 key购买 nike

我想为 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 文件夹被撰写文件中的卷屏蔽。

最佳答案

我认为您可以在不创建衍生图像的情况下做到这一点。

当 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

关于postgresql - 自定义 PostgreSQL 并修改了配置文件和存储在主机文件系统上的数据库文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49700363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com