gpt4 book ai didi

docker-compose set environment per-service 配置文件

转载 作者:行者123 更新时间:2023-12-05 04:47:15 24 4
gpt4 key购买 nike

我最近发现了docker-compose profiles ,这似乎非常适合允许可选的本地资源进行测试

但是,尚不清楚是否可以根据配置文件提供具有不同环境的容器;按服务配置文件切换环境变量的明智方法是什么(如果有的话)?

也许

  • 使用 extends(这似乎已被弃用,但无论如何对我还是有用的 Extend service in docker-compose 3)
  • 配置文件值是或可以提供给容器,以便它可以在内部切换
  • 设计中从未打算或考虑过这一点(启动时探测本地连接、卷安装技巧......)

具体来说,我试图在某些测试配置文件下通过 env var 更喜欢地址和一些 key ,但更喜欢 .env 文件。

正常结构

services:
webapp:
...
env_file:
- .env

具有测试配置文件的结构

services:
db-service:
image: db-image
profiles: ["test"]
...
webapp:
...
environment:
- DATABASE_HOST=db-service:1234

最佳答案

我可以肯定地说,这绝不是配置文件的预期用例:)

docker-compose 没有将当前配置文件传递给服务的原生方式。作为解决方法,您可以将 COMPOSE_PROFILES 环境变量传递给容器。但这在命令行上使用 --profiles 标志指定配置文件时不起作用。此外,您还必须正确地手动处理具有多个 事件配置文件。

针对您的特定问题的最佳解决方案是为每个配置文件提供不同的服务:

services:
webapp-prod:
profiles: ["prod"]
#...
env_file:
- .env

db-service:
image: db-image
profiles: ["test"]
#...

webapp-test:
profiles: ["test"]
#...
environment:
- DATABASE_HOST=db-service:1234

这唯一的缺点是具有不同配置的“相同”服务的不同服务名称,并且它们都需要分配的配置文件,因此它们都不会默认启动,即每个配置文件。

它还有一些用于两个服务定义的重复代码。如果您想共享文件中的定义,可以使用 yaml anchors and aliases :

services:
webapp-prod: &webapp
profiles: ["prod"]
#...
env_file:
- .env

webapp-test:
<<: *webapp
profiles: ["test"]
environment:
- DATABASE_HOST=db-service:1234

db-service:
image: db-image
profiles: ["test"]
#...

另一种选择可能是 using multiple compose files :

# docker-compose.yml
services:
webapp:
#...
env_file:
- .env
# docker-compose.test.yml
services:
db-service:
image: db-image
#...

webapp:
environment:
- DATABASE_HOST=db-service:1234

这样您就可以正常启动生产服务,并通过传递和合并组合文件来启动实例:

docker-compose up # start the production version
docker-compose -f docker-compose.yml -f docker-compose.test.yml # start the test version

关于docker-compose set environment per-service 配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68549227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com