首页 > 解决方案 > 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

标签: dockerdocker-compose

解决方案


通过使用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

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

  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

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

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

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

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

  service2:
    <<: *service
    command: ...
    image: ...

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


推荐阅读