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

Postgresql 在postgres容器中创建多个数据库,postgresql,docker,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 /do

我的应用程序需要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/
在这里,只有最后一个DB(my_DB_prod)正在启动


如何一次完成所有3个任务?

使用
ENV
Dockerfile命令在构建时设置一个环境变量。
COPY
也在构建时执行,基本上覆盖了
docker入口点initdb.d

调用这些操作时,最新执行的操作将覆盖前一个操作,因此映像最终状态将具有
POSTGRES\u DB=my\u DB\u prod
,并且
docker入口点initdb.d
将具有
proddb.sql
的内容

数据库不是在生成时创建的。相反,它是在运行时按照
/docker-entrypoint-initdb.d/(/proddb.sql)
POSTGRES\u DB my\u DB\u prod
中的说明创建的,因此这是从构建时开始的一系列命令离开映像的状态

要创建多个数据库,您可以将3个入口点的脚本合并到一个数据库中,或者更好,为每个数据库创建一个脚本,并让脚本读取不同的环境:

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

是一个可以节省时间的完整示例。

使用
ENV
Dockerfile命令在生成时设置环境变量。
COPY
也在构建时执行,基本上覆盖了
docker入口点initdb.d

调用这些操作时,最新执行的操作将覆盖前一个操作,因此映像最终状态将具有
POSTGRES\u DB=my\u DB\u prod
,并且
docker入口点initdb.d
将具有
proddb.sql
的内容

数据库不是在生成时创建的。相反,它是在运行时按照
/docker-entrypoint-initdb.d/(/proddb.sql)
POSTGRES\u DB my\u DB\u prod
中的说明创建的,因此这是从构建时开始的一系列命令离开映像的状态

要创建多个数据库,您可以将3个入口点的脚本合并到一个数据库中,或者更好,为每个数据库创建一个脚本,并让脚本读取不同的环境:

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

这是一个完整的例子,可以节省一些时间。

我继续这样做,它对我很有用

my 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。

我采用这种方法,它对我有效

my 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。

当您重写POSTGRES_DB env时,postgresql没有启动,因此只有最后创建的数据库,您可以访问容器并登录psql来创建其他数据库;当您重写POSTGRES_DB env时,postgresql没有启动,因此只有最后创建的数据库,您可以访问容器并登录psql来创建其他数据库;在这种情况下,我的Dockerfile shud只包含以下内容?来自postgres ENV postgres_用户postgres ENV postgres_密码postgres COPY./create_first_db.sql/docker-entrypoint-initdb.d/create_second_db.sqlCOPY./create_second_db.sql/docker-entrypoint-initdb.d/create_second_db.sql COPY./create_second_第三_db.sql/docker-entrypoint-initdb.d/create\u third\u db.sqlShud我在脚本本身中添加了创建数据库查询?在大的
docker-entrypoint initdb.d
中创建数据库将起作用,但在
/docker-entrypoint initdb.d/
下创建init脚本更干净。这些应该由initdb发现并执行。@Ranjith是一个可以节省您一些时间的示例。但是,使用Docker,如果运行3个不同的容器,每个数据库一个容器,则开销非常小。实际上,这是一个更好的实践,因此它将更好地隔离您的dev/test/prod范围。假设您需要在测试环境DB上运行压力测试-这也会影响开发和产品数据库,因此,它们在同一个容器中运行。在这种情况下,我的Dockerfile shud只包含以下内容?来自postgres ENV postgres_用户postgres ENV postgres_密码postgres COPY./create_first_db.sql/docker-entrypoint-initdb.d/create_secondary_db.sqlCOPY./create_secondary_db.sql/docker-entrypoint-initdb.d/create_secondary_db.sql COPY./create_third_db.sql/docker-entrypoint-initdb.d/create_third_db.sqlShud我在脚本本身中添加了创建数据库查询?在大的
docker entrypoint initdb.d
中创建数据库将起作用,但在
/docker entrypoint initdb.d/
下创建init脚本更干净。这些应该由initdb发现并执行。@Ranjith是一个可以节省您一些时间的示例。但是,使用Docker,如果运行3个不同的容器,每个数据库一个容器,则开销非常小。实际上,这是一个更好的实践,因此它将更好地隔离您的dev/test/prod范围。假设您需要在测试环境DB上运行压力测试-这也会影响dev和prod数据库,因此它们运行在同一个容器中。每个数据库的所有权如何?我们在哪里指定/分配呢?亲爱的Ranjith,我在sql脚本中特别提到了这一点。每个数据库的所有权如何?我们在哪里指定/分配它呢?亲爱的Ranjith,我在sql脚本中特别提到了这一点。