docker-compose - 具有相同服务的多个容器

docker-compose - Multiple containers with same service

我想创建 2 个除了环境变量外设置几乎相同的容器。

尝试了几件事都没有成功,尤其是 .override.yml(将多个 .yml 传递给 docker-compose 覆盖前一个)。

# docker-compose.yml
version: '3.7'
services:
  web:
    image: nginx
    container_name: test-web
    ports:
      - 80:80

现在另一个

# docker-compose.override.yml
version: '3.7'
services:
  web:
    container_name: dupe-web
    ports:
      - 8080:80

正在做:

$ docker-compose -f docker-compose.yml -f docker-compose.override.yml up -d
Recreating test-web ... done

杀死 test-web 容器并启动新名称 dupe-web

有没有办法让两者都使用相同的服务启动?

就我而言,我想创建两个容器:

欢迎任何帮助。

如果您将服务命名为相同的名称,则会覆盖它。所以你的文件名docker-compose.override.yml其实很贴切

我认为这是合乎逻辑且合乎需要的。您还能如何覆盖,第二个文件中的服务名称是什么? Compose 必须以某种方式为您选择一个。毕竟,这没有意义,imo。

您可以使用 YAML anchors/overrides 来满足您的需要,但它们必须位于同一个文件中才能正常工作。

name: example
services:
  web: &web
    image: nginx
    container_name: test-web
    ports:
      - 80:80
  web2:
    <<: *web
    container_name: dupe-web
    ports:
      - 8080:80

我还建议删除容器名称。

name: example
services:
  test-web: &web
    image: nginx
    ports:
      - 80:80
  dupe-web:
    <<: *web
    ports:
      - 8080:80

如果你 运行 docker compose config 你可以看到标准化规格:

name: example
services:
  dupe-web:
    image: nginx
    networks:
      default: null
    ports:
    - mode: ingress
      target: 80
      published: "8080"
      protocol: tcp
  test-web:
    image: nginx
    networks:
      default: null
    ports:
    - mode: ingress
      target: 80
      published: "80"
      protocol: tcp
networks:
  default:
    name: example_default