我有一个由两个主要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 文件位于哪个数据库中?
通常,当我在 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: #
警告:显然,更多的容器通常意味着更高的内存占用
根据此 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 变量
嗯 - 看看这个 Github 项目:https://github.com/mrts/docker-postgresql-multiple-databases
根据官方 postgres docker 镜像文档:
如果您想在从此镜像派生的镜像中进行其他初始化,请在 /docker-entrypoint-initdb.d 下添加一个或多个 *.sql、*.sql.gz 或 *.sh 脚本(如果满足以下条件,则创建该目录)必要的)。在入口点调用 initdb 创建默认的 postgres 用户和数据库后,它将运行任何 *.sql 文件并获取在该目录中找到的任何 *.sh 脚本,以便在启动服务之前进行进一步的初始化。
您将在该存储库上找到可以使用的准备好的脚本。
受到已接受答案的启发,但对 db 用户被硬编码的事实不满意,我创建了一个功能齐全的解决方案(带有相关 bash 脚本的 docker-compose.yml 文件)来解决该问题。
使用相同的机制 -> 将数据库名称值添加到
POSTGRES_MULTIPLE_DATABASES
变量并构建或安装,但这次相关用户将负责这些数据库。
您可以使用 docker-compose 文件,将占位符替换为当前值,一切都可以运行。一切都在自述文件中进行了解释。
这是 github 存储库。