docker-compose 设置每个服务配置文件的环境

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)

acr*_*ran 5

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

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)