Docker compose:运行多个仅命令不同的容器

sza*_*gab 2 docker docker-compose

我有一个docker-compose.override.yml启动 10 个不同服务的文件,这些服务仅在容器名称和它们运行的​​命令上有所不同。他们还需要各种环境变量、多个卷等。

该文件看起来像这样,但它有 10 个部分,每个部分实际上有更多的配置。

我不喜欢所有的重复。

有没有办法将所有公共配置部分移到其他地方并让所有服务都使用这些信息?

也许还有其他解决方案?

version: "3"
services:
  service-1:
    image: my-image
    tty: true
    environment:
      - APP_ENVIRONMENT=dev
    working_dir: /source
    volumes:
      - .:/source:ro
    command: run_services_1

  service-2:
    image: my-image
    tty: true
    environment:
      - APP_ENVIRONMENT=dev
    working_dir: /source
    volumes:
      - .:/source:ro
    command: run_services_2
Run Code Online (Sandbox Code Playgroud)

Dan*_*nyB 11

通过使用YAML 锚点和别名功能,可以轻松地重用 docker-compose 文件中的代码块。

例如:

services:
  service1: &default
    image: alpine
    environment:
      APP_ENVIRONMENT: dev
    command: env

  service2:
    <<: *default
    command: echo some other command

  service3:
    <<: *default
    environment:
      APP_ENVIRONMENT: prod
Run Code Online (Sandbox Code Playgroud)

对于更高级的情况,您还可以使用这两个技巧:

  1. 仅将配置块的一部分标记为属于&default或其他标记。
  2. 定义多个标记,并在部分之间创建某种继承。

这是这两个功能的简单示例:

services:
  bash:
    build: .

    # Only the below will be used for anyone inheriting from &default
    <<: &default
      image: me/my-image
      environment:
        APPENV: dev

  web: &web
    # Inherit from default
    <<: *default
    command: env

  prod:
    # Inherit from web
    <<: *web
    environment:
      APPENV: production
Run Code Online (Sandbox Code Playgroud)

您可以将其与仅包含或类似内容的简单 Dockerfile 一起尝试FROM alpine

最后,值得一提的是 docker-compose 支持隐藏的配置块,他们称之为扩展字段。任何以 开头的内容x-都会被忽略,因此可以使用它来定义模板,例如:

x-service: &service
  depends_on: [nginx]
  restart: always

services:
  service1:
    <<: *service
    command: ...

  service2:
    <<: *service
    command: ...
    image: ...
Run Code Online (Sandbox Code Playgroud)

附带提示:version: 3从您的文件中删除,除非有特定原因。新的 docker compose 不再需要它。