node.js, Rabbitmq & Docker: 使用seneca的服务似乎在rabbitmq之前启动

node.js, Rabbitmq & Docker: the service using seneca seems to start before rabbitmq

我正在使用 docker 创建多个容器,其中一个包含一个 rabbitmq 实例,另一个包含应该响应队列活动的 node.js 操作。遍历 docker-compose 日志,我看到很多 ECONNREFUSED 错误,然后我看到该行从哪里开始表明 rabbitmq 已经在它的容器中启动。这似乎表明 rabbitmq 似乎是在需要它的服务之后启动的。

作为侧边栏,为了排除任何其他可能的原因,这里是 node.js 连接到 rabbitmq 的连接字符串:

amqp://rabbitmq:5672

这里是 docker-compose.yaml 文件中 rabbitmq 的条目:

rabbitmq:
container_name: "myapp_rabbitmq"
   tty: true
   image: rabbitmq:management
   ports:
     - 15672:15672
     - 15671:15671
     - 5672:5672
   volumes:
     - /rabbitmq/lib:/var/lib/rabbitmq
     - /rabbitmq/log:/var/log/rabbitmq
     - /rabbitmq/conf:/etc/rabbitmq/
service1:
   container_name: "service1"
   build:
     context: .
     dockerfile: ./service1.dockerfile
   links:
     - mongo
     - rabbitmq
   depends_on:
     - mongo
     - rabbitmq
service2:
   container_name: "service2"
   build:
     context: .
     dockerfile: ./service2/dockerfile
   links:
     - mongo
     - rabbitmq
   depends_on:
     - mongo
     - rabbitmq

这个计时问题的解决方法是什么?

如何让 rabbitmq 在消费容器启动之前启动?

如果这不是时间问题,而是配置问题,请告诉我。我列出的 docker-compose.yml 条目中的问题?

您似乎没有包含完整的 docker-compose 文件。我希望在撰写中也能看到您的节点容器。我认为问题是你需要

 depends_on:
  - "rabbitmq"

在你的 docker compose

的节点容器部分

更多关于 compose 依赖的信息:https://docs.docker.com/compose/startup-order/

请注意,正如本页所建议的那样,您应该结合使您的应用对外部服务中断具有弹性来执行此操作。

您需要控制依赖容器的启动过程。以下文件相同

https://docs.docker.com/compose/startup-order/

我通常使用 wait-for-it.sh 下面项目的文件

https://github.com/vishnubob/wait-for-it

所以我的 service1

中会有以下命令
wait-for-it.sh rabbitmq:5672 -t 90 -- command with args to launch service1