Rabbitmq 图:docker容器开始同步

Rabbitmq 图:docker容器开始同步,rabbitmq,docker,fig,Rabbitmq,Docker,Fig,对于我的一个家庭项目,我决定使用docker容器和fig进行编排(第一次使用这些工具) 这是我的fig.yaml: rabbitmq: image: dockerfile/rabbitmq:latest mongodb: image: mongo app: build: . command: python /code/app/main.py links: - rabbitmq - mongodb volumes: - .:/code Rabbitmq的

对于我的一个家庭项目,我决定使用docker容器和fig进行编排(第一次使用这些工具)

这是我的fig.yaml:

rabbitmq:
  image: dockerfile/rabbitmq:latest
mongodb:
  image: mongo
app:
  build: .
  command: python /code/app/main.py
  links:
   - rabbitmq
   - mongodb
  volumes:
   - .:/code
Rabbitmq的启动时间比我的应用程序的加载时间慢得多。即使rabbitmq容器首先开始加载(因为它在应用程序链接中),但当我的应用程序尝试连接到rabbitmq服务器时,它仍然不可用(这肯定是加载时间问题,因为如果我在连接到rabbitmq之前只插入睡眠5秒,一切正常)。是否有一些标准方法来解决加载时间同步问题


谢谢。

我遇到过类似的问题,我在
Dockerfiles
中使用设置为
CMD
的自定义脚本解决了这些问题。然后,您可以运行您想要的任何check命令(
sleep
一段时间,或者等待服务监听)。我认为没有一个标准的方法可以做到这一点,无论如何,我认为最好的方法是应用程序运行时能够要求外部服务启动并运行,并连接到它们,但在大多数情况下这是不可能的。

我认为没有一个标准的方法来解决这个问题,但这是一个众所周知的问题,有些人有可以接受的解决办法

Docker issue tracker上有这样一个问题:在容器侦听暴露的端口之前,不考虑容器已启动。然而,由于它会在其他地方造成其他问题,它可能不会被接受。在同一个问题上也存在着分歧

简单的解决办法是像@jcortejoso说的那样睡觉。例如:

然后在启动应用程序服务器之前使用
检查“DB Server”${RABBITMQ\u PORT\u 5672\u TCP\u ADDR}5672
,如上面的链接所述

另一个选择是使用。在您的
图yml

rabbitmq:
  image: dockerfile/rabbitmq:latest
mongodb:
  image: mongo
rabbitmqready:
  image: aanand/wait
  links:
   - rabbitmq
app:
  build: .
  command: python /code/app/main.py
  links:
   - rabbitmqready
   - mongodb
  volumes:
   - .:/code

为了在我们的CI上进行测试,我们构建了一个可在Docker容器中使用的应用程序,以等待链接服务就绪。它会自动从环境变量中查找所有链接的TCP服务,并反复并发地尝试建立TCP连接,直到成功或超时

我们还写了一篇文章

rabbitmq:
  image: dockerfile/rabbitmq:latest
mongodb:
  image: mongo
rabbitmqready:
  image: aanand/wait
  links:
   - rabbitmq
app:
  build: .
  command: python /code/app/main.py
  links:
   - rabbitmqready
   - mongodb
  volumes:
   - .:/code