在postgres容器中创建多功能数据库

时间:2020-09-04 07:09:17

标签: 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)正在启动。

我怎么一次补全全部三个?

2 个答案:

答案 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。