Postgresql 在postgres容器中创建多个数据库
我的应用程序需要3个数据库。我正在使用PostgreSQL。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个数据库。所有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脚本中特别提到了这一点。