多个数据库在Docker和Docker-compose中的应用

75

我有一个项目,包含两个主要的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文件要放到哪个数据库中呢?

我知道我可以把所有的 .sql 文件放在 docker-entrypoint-initdb.d 目录中,然后 Postgres 会自动执行它们。但是,我应该如何指定哪个 .sql 文件要放到哪个数据库中呢?


1
扩容或分布式扩展。另一个选择是拥有多个Postgres容器。适合我的每个应用程序一个数据库的架构,也许不适合你的8个数据库中的2个应用程序。但对于其他人来说,值得考虑。然后您就不必考虑任何笨拙的解决方法,并且可以更轻松地启动和关闭更多独立的数据库。尽管这需要更多的资源。 - flurdy
3个回答

55

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

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

2
我在Jenkins中运行CI管道时实际上使用这个...我只需更改Postgres容器的端口...然后就可以开始了... - Tomislav Mikulin
1
谢谢。我花了几个小时试图将创建新数据库和运行迁移合并到一个容器中。 - David Lartey
3
根据您的使用情况,您也可以选择不同的网络而不是不同的端口。 - kaiser
1
卷是否可以指向同一位置? - Nikola-Milovic
1
每个额外的容器都会占用额外的内存 =( - Eugen Konkov
不是直接回答,但提供了一个很好的角度。点赞。 - yerlilbilgin

48
根据这个 Github 问题,通过使用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 变量来传递多个数据库名称。

1
这并没有回答最后一个问题:如何有选择性地填充创建的数据库? - achimh
2
有关选择性填充的问题仍未得到解答。从我在文档中看到的内容来看,您可能可以在每个加载的SQL文件中添加\c <DB>以选择数据库。但这仍然感觉很不正规。顺便说一下:从您提到的两个存储库中,一个是另一个的分支,而另一个已经在其他答案中提到了。 - achimh

12

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

根据官方 postgres docker 镜像文档:

 

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

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


1
这实际上是在说与被接受的答案相同 - 我不理解为什么会有负评。 - Javier Arias
3
我认为这是因为它强迫用户重复阅读同样的信息,浪费额外的时间而导致的。 - Eugen Konkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接