docker 和 docker-compose 中的多个数据库

问题描述 投票:0回答:4

我有一个由两个主要Java应用程序组成的项目,它们使用八个Postgres数据库,那么docker-compose中有没有一种方法可以构建八个不同的数据库,以便每个数据库都有不同的所有者和密码?我什至可以在 docker-compose 中做到这一点吗?

示例:

services:
    postgresql:
        build: db/.
        ports:
            - "5432:5432"
        environment:
          - POSTGRES_DB=database1
          - POSTGRES_USER=database1
          - POSTGRES_PASSWORD=database1

我知道我可以将所有 .sql 文件放入 docker-entrypoint-initdb.d 中,Postgres 会自动生成它们,但是我如何声明哪个 .sql 文件位于哪个数据库中?

postgresql docker docker-compose
4个回答
61
投票

通常,当我在 Docker 项目中需要多个数据库时,它就是一个测试数据库。我发现简单地启动第二个 docker 容器更容易,而无需担心脚本或卷分离。 主要技巧是不要与默认端口冲突(例如 postgres 的 5432),然后就可以开始了。 那么

docker-compose
可以像这样简单:

version: '3.0'

services: 

  db:
    image: postgres
    environment: 
      - POSTGRES_DB
      - POSTGRES_USER
      - POSTGRES_PASSWORD
    ports:
      - ${POSTGRES_DEV_PORT}:5432
    volumes:
      - app-volume:/var/lib/postgresql/data

  db-test:
    image: postgres
    environment: 
      - POSTGRES_DB
      - POSTGRES_USER
      - POSTGRES_PASSWORD
    ports:
      - ${POSTGRES_TEST_PORT}:5432
    # Notice I don't even use a volume here since I don't care to persist test data between runs

volumes:
  app-volume: #

警告:显然,更多的容器通常意味着更高的内存占用


48
投票

根据此 Github issue 可能可以通过使用 bash 脚本来实现多个数据库,您必须在 Dockerfile 中传递这些脚本

编辑

要创建多个数据库,您可以使用以下脚本:

https://github.com/mrts/docker-postgresql-multiple-databases

https://github.com/MartinKaburu/docker-postgresql-multiple-databases

这建议您必须克隆上述 git 存储库之一并将其作为卷安装到: /docker-entrypoint-initdb.d 然后您就可以使用以下方式传递多个数据库名称: POSTGRES_MULTIPLE_DATABASES 变量


12
投票

嗯 - 看看这个 Github 项目:https://github.com/mrts/docker-postgresql-multiple-databases

根据官方 postgres docker 镜像文档:

如果您想在从此镜像派生的镜像中进行其他初始化,请在 /docker-entrypoint-initdb.d 下添加一个或多个 *.sql、*.sql.gz 或 *.sh 脚本(如果满足以下条件,则创建该目录)必要的)。在入口点调用 initdb 创建默认的 postgres 用户和数据库后,它将运行任何 *.sql 文件并获取在该目录中找到的任何 *.sh 脚本,以便在启动服务之前进行进一步的初始化。

您将在该存储库上找到可以使用的准备好的脚本。


0
投票

受到已接受答案的启发,但对 db 用户被硬编码的事实不满意,我创建了一个功能齐全的解决方案(带有相关 bash 脚本的 docker-compose.yml 文件)来解决该问题。

使用相同的机制 -> 将数据库名称值添加到

POSTGRES_MULTIPLE_DATABASES
变量并构建或安装,但这次相关用户将负责这些数据库。

您可以使用 docker-compose 文件,将占位符替换为当前值,一切都可以运行。一切都在自述文件中进行了解释。

这是 github 存储库

© www.soinside.com 2019 - 2024. All rights reserved.