【问题标题】:Multiple databases in docker and docker-composedocker 和 docker-compose 中的多个数据库
【发布时间】:2017-10-10 13:38:04
【问题描述】:

我有一个项目,由两个使用八个 Postgres 数据库的主要 Java 应用程序组成,那么 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 文件放在哪个数据库中?

【问题讨论】:

  • 向上或向外扩展。另一种选择是拥有多个 postgres 容器。适合我的每个应用程序架构一个 db,并且可能少于 8 个 dbs 的 2 个应用程序。但对其他人来说,这是值得考虑的。然后,您不必考虑任何笨拙的解决方法,并且拥有更多独立的数据库,您可以更轻松地进行上下移动。虽然它需要更多的资源。

标签: postgresql docker docker-compose


【解决方案1】:

通常当我在 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: #

【讨论】:

  • 我在 jenkins 中运行我的 CI 管道时实际上使用了它......我只是更改了 postgres 容器的端口......然后它就消失了......
  • 谢谢。我花了几个小时试图弯曲新数据库的创建并将迁移运行到一个容器中。
  • 您也可以使用不同的网络而不是不同的端口 - 取决于您的用例。
【解决方案2】:

根据这个 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变量

【讨论】:

  • 这并没有解决最后一个问题:如何选择性地归档创建的数据库?
  • 选择性填充的问题还没有回答。根据我在文档中看到的内容,您可以在加载的每个 sql 文件中添加一个 \c <DB> 以选择数据库。仍然感觉很hacky。顺便说一句:在您提到的两个存储库中,一个是另一个的分支,另一个已经在另一个答案中提到。
【解决方案3】:

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

根据官方 postgres docker 镜像文档:

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

你会在那个 repo 上找到准备好的脚本,你可以使用它。

【讨论】:

  • 这实际上与接受的答案相同 - 我不明白反对票
猜你喜欢
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 2020-06-28
相关资源
最近更新 更多