postgresql - 在postgres容器中创建多个数据库

标签 postgresql docker

我的应用程序需要3个数据库。我正在使用PostgreSQL。
如何一次性启动所有3个数据库。这3个表和脚本均不同。对于其中的每一个,都通过复制*.sql来执行Dockerfile文件。
我以常规方式尝试。没用
Dockerfile:

FROM postgres
ENV POSTGRES_USER postgres 
ENV POSTGRES_PASSWORD postgres 

ENV POSTGRES_DB my_db_dev
COPY /devdb.sql /docker-entrypoint-initdb.d/


ENV POSTGRES_DB my_db_test
COPY /testdb.sql /docker-entrypoint-initdb.d/


ENV POSTGRES_DB my_db_prod
COPY /proddb.sql /docker-entrypoint-initdb.d/
在这里,只有最后一个数据库(my_db_prod)正在启动。
我如何一次将所有三个组成?

最佳答案

ENV Dockerfile命令在构建时设置环境变量。COPY也在构建时执行,基本上覆盖了docker-entrypoint-initdb.d当您调用这些操作时,最新执行的操作将覆盖前一个操作,因此图像最终状态将具有POSTGRES_DB=my_db_prod,而docker-entrypoint-initdb.d将具有proddb.sql的内容。
该数据库不是在构建时创建的。相反,它是根据/docker-entrypoint-initdb.d/ (/proddb.sql )POSTGRES_DB my_db_prod的指令在运行时创建的,因此,这是从构建时开始的一系列命令离开镜像的状态。
要创建多个数据库,您可以将3个入口点的脚本合并到一个数据库中,或者更好的是,每个DB具有一个脚本,并使这些脚本读取不同的ENV:

COPY ./create_second_db.sql /docker-entrypoint-initdb.d/create_second_db.sql
COPY ./create_third_db.sql /docker-entrypoint-initdb.d/create_third_db.sql
Here是一个完整的示例,可以节省一些时间。

关于postgresql - 在postgres容器中创建多个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63736434/

相关文章:

wordpress - 如何在停止的 Docker 容器上运行命令?

ruby-on-rails - Rails EXCEPT 查询(过滤出联合表中存在的记录)

sql - 带有许多 :many join is very slow 的 PostgreSQL 查询

postgresql - 如何在准备好的语句中传递带有 ' '(时间戳)的字符串?

postgresql - 臭名昭著的 java.sql.SQLException : No suitable driver found

docker - 如何从另一个 docker compose 文件运行 docker compose 文件?

docker - Gcloud Kubernetes 连接拒绝公开服务

sql - 将 2 个 CTE 替换为一个

linux - 部署Web UI时"The ClusterRoleBinding "kubernetes-dashboard "is invalid: roleRef: Invalid value"

docker - 从容器内部获取自省(introspection)元数据