ti7*_*ti7 5 integration-testing environment-variables docker-compose
我最近发现了docker-compose profile,它似乎非常适合允许可选的本地资源进行测试
然而,尚不清楚是否可以根据配置文件提供具有不同环境的容器;什么是按服务配置文件切换环境变量的明智方法(如果有)?
也许
extends(似乎已弃用,但可能对我有用在 docker-compose 3 中扩展服务)具体来说,我试图在某些测试配置文件下通过 env var 更喜欢地址和一些密钥,但更喜欢.env其他文件。
正常结构
services:
webapp:
...
env_file:
- .env
Run Code Online (Sandbox Code Playgroud)
结构与test轮廓
services:
db-service:
image: db-image
profiles: ["test"]
...
webapp:
...
environment:
- DATABASE_HOST=db-service:1234
Run Code Online (Sandbox Code Playgroud)
我可以肯定地说,这从来都不是配置文件的预期用例:)
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
Run Code Online (Sandbox Code Playgroud)
这只具有不同配置的“相同”服务的不同服务名称的缺点,并且它们都需要分配的配置文件,因此默认情况下它们都不会启动,即每个配置文件都不会启动。
它还具有两个服务定义的一些重复代码。如果您想共享文件中的定义,您可以使用yaml 锚点和别名:
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"]
#...
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用多个撰写文件:
# docker-compose.yml
services:
webapp:
#...
env_file:
- .env
Run Code Online (Sandbox Code Playgroud)
# docker-compose.test.yml
services:
db-service:
image: db-image
#...
webapp:
environment:
- DATABASE_HOST=db-service:1234
Run Code Online (Sandbox Code Playgroud)
这样您就可以通过传递和合并撰写文件来正常启动生产服务和实例:
docker-compose up # start the production version
docker-compose -f docker-compose.yml -f docker-compose.test.yml # start the test version
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5231 次 |
| 最近记录: |