我的应用程序需要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)正在启动。
我怎么一次补全全部三个?
答案 0 :(得分:0)
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个入口点的脚本合并到一个数据库中,或者甚至更好,每个数据库有一个脚本,并且这些脚本读取不同的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是一个可以节省一些时间的完整示例。
答案 1 :(得分:0)
我以这种方式跟进,对我有用。
我的docker-compose.yml:
version: '3.7'
db:
image: postgres:10.5
container_name: pg
restart: always
environment:
POSTGRES_PASSWORD: postgres
volumes:
- /initdb:/docker-entrypoint-initdb.d
ports:
- "5432:5432"
我将一个 initdb 文件夹从docker主机安装到上述的postgres容器中。 initdb里面有2个sql文件。并且成功运行了两个脚本sql。