【问题标题】:How do I direct docker-compose to not start a service if its already running?如果服务已经运行,我如何指示 docker-compose 不启动服务?
【发布时间】:2021-03-20 15:21:18
【问题描述】:

我有两个独立的服务,在不同的目录中,为同一个 docker 网络配置。

Service PUB 是一个 RabbitMQ 发布者。它的 docker-compose 文件启动服务 PUB 和 RabbitMQ。

Service WRK 是一个 RabbitMQ 工作者。它的 docker-compose 文件启动服务 WRK 和 RabbitMQ。

docker-compose up -d PUB 将启动 PUB 和 RabbitMQ,但随后运行 docker-compose up -d WKR 将失败,因为已经分配了 RabbitMQ 端口。 Bind for 0.0.0.0:15672 failed: port is already allocated

但是,如果我还没有启动 PUB,docker-compose up -d WRK 会同时启动 WRK 和 RabbitMQ。

如何配置 docker-compose.yml 文件,以便如果 RabbitMQ 已经在运行,它不会尝试启动 RabbitMQ 而只是连接到现有实例?

服务 PUB 的 docker-compose.yml:

services:
  PUB:
    image: pub-image
    networks:
      - myNet
    environment:
      RMQ_URI: amqp://guest@rabbitmq:5672//
    ports:
      - 127.0.0.1:5000:5000/tcp
    links:
      - rabbitmq:rabbitmq
    depends_on:
      - rabbitmq

  rabbitmq:
    image: rabbitmq:3.8.14-management
    networks:
      - myNet
    ports:
      - 5672:5672
      - 15672:15672

networks:
  myNet:
    name: myNet
    driver: bridge

用于服务 WRK 的 docker-compose.yml:

services:
  WRK:
    image: wrk-image
    networks:
      - myNet
    environment:
      RMQ_URI: amqp://guest@rabbitmq:5672//
    links:
      - rabbitmq:rabbitmq
    depends_on:
      - rabbitmq

  rabbitmq:
    image: rabbitmq:3.8.14-management
    networks:
      - myNet
    ports:
      - 5672:5672
      - 15672:15672

networks:
  myNet:
    name: myNet
    driver: bridge

【问题讨论】:

  • 您已经声明了两次 rabbitmq,因此您要求 Compose 创建 pub_rabbitmq_1wrk_rabbitmq_1,作为单独的代理,使用相同的主机端口。参见例如Communication between multiple docker-compose projects 让一个项目与另一个项目的 RabbitMQ 对话。
  • links: 在现代 Docker 中是不必要的;可以使用 Compose 提供的 default 网络,并删除所有 networks: 块。)
  • @DavidMaze 当且仅当一个rabbitmq尚未运行时,我才想启动一个rabbitmq,但来自AdamP的解决方案让我重新考虑我的用例,我可以在其中使用相同的docker-compose文件每个单独的项目目录,因为它们确实保持关系。现在我可以从任一目录本地运行/测试。

标签: docker docker-compose rabbitmq


【解决方案1】:

因为您没有在这些撰写文件中使用卷,因此可以合并它们:

services:
  WRK:
    image: wrk-image
    networks:
      - myNet
    environment:
      RMQ_URI: amqp://guest@rabbitmq:5672//
    links:
      - rabbitmq:rabbitmq
    depends_on:
      - rabbitmq
  PUB:
    image: pub-image
      networks:
        - myNet
      environment:
        RMQ_URI: amqp://guest@rabbitmq:5672//
      ports:
        - 127.0.0.1:5000:5000/tcp
      links:
        - rabbitmq:rabbitmq
      depends_on:
        - rabbitmq

  rabbitmq:
    image: rabbitmq:3.8.14-management
    networks:
      - myNet
    ports:
      - 5672:5672
      - 15672:15672

networks:
  myNet:
    name: myNet
    driver: bridge

【讨论】:

  • 我没有考虑过,因为这是两个独立的服务,在不同的目录中......但这并不重要,因为服务是由它们的 docker 镜像启动的。
猜你喜欢
  • 2016-09-07
  • 2018-05-05
  • 2016-11-17
  • 2020-06-30
  • 2018-03-29
  • 2022-01-23
  • 1970-01-01
  • 2023-04-03
  • 2014-09-27
相关资源
最近更新 更多