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

Tom*_*lin 6 postgresql docker docker-compose

我有一个包含两个主要Java应用程序的项目,这些应用程序使用八个postgres数据库,那么docker-compose中是否有一种方法可以构建八个不同的数据库,以便每个数据库具有不同的所有者和密码?我什至可以在docker-compose中做到这一点吗?

例如

services:
    postgresql:
        build: db/.
        ports:
            - "5432:5432"
        environment:
          - POSTGRES_DB=database1
          - POSTGRES_USER=database1
          - POSTGRES_PASSWORD=database1
Run Code Online (Sandbox Code Playgroud)

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

Tnx,汤姆

Ric*_* P. 13

通常当我在 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: #
Run Code Online (Sandbox Code Playgroud)

  • 您也可以使用不同的网络而不是不同的端口 - 根据您的使用情况。 (3认同)
  • 实际上,我在 jenkins 中运行 CI pipline 时使用了这个...我只是更改了 postgres 容器的端口...然后它就消失了... (2认同)

Ser*_*giu 5

根据这个Github 问题,可能需要使用bash脚本来实现多个数据库,而这些bash脚本必须在Dockerfile中传递

编辑

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

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

要么

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

这表明您必须克隆上述git repos之一并将其作为卷安装到:/docker-entrypoint-initdb.d,然后才能使用以下命令传递多个数据库名称:POSTGRES_MULTIPLE_DATABASES变量

  • 选择性填充的问题仍然没有得到解答。根据我在文档中看到的内容,您可以在加载的每个 sql 文件中添加 `\c <DB>` 以选择数据库。感觉还是很hacky。顺便说一句:从您提到的两个存储库中,一个是另一个的分支,另一个已经在另一个答案中提到了。 (2认同)

Prz*_*wak 5

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

根据官方的postgres docker镜像文档

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

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

  • @JavierArias:我认为这是因为它迫使用户两次阅读相同的信息并花费额外的时间 (3认同)