图:docker集装箱开始同步

对于我的家庭项目之一,我决定使用docker集装箱和无花果进行编排(首次使用这些工具)。

这是我的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服务器它还不可用(这是肯定加载计时问题,因为如果我只是插入睡眠5秒之前连接到rabbitmq – 一切工作正常)。 有一些标准的方法来解决加载时间同步问题?

谢谢。

我不认为有一个标准的方法来解决这个问题,但这是一个已知的问题,有些人有可接受的解决方法。

有一个关于 Docker问题跟踪器的build议 ,关于不考虑容器的启动,直到它在暴露的端口上进行侦听。 但是由于其他问题会造成其他问题,因此可能不会被接受。 同样的话题也有无花果build议 。

简单的解决办法就是像@jcortejoso说的那样睡觉。 来自http://blog.chmouel.com/2014/11/04/avoiding-race-conditions-between-containers-with-docker-and-fig/的示例:

 function check_up() { service=$1 host=$2 port=$3 max=13 # 1 minute counter=1 while true;do python -c "import socket;s = socket.socket(socket.AF_INET, socket.SOCK_STREAM);s.connect(('$host', $port))" \ >/dev/null 2>/dev/null && break || \ echo "Waiting that $service on ${host}:${port} is started (sleeping for 5)" if [[ ${counter} == ${max} ]];then echo "Could not connect to ${service} after some time" echo "Investigate locally the logs with fig logs" exit 1 fi sleep 5 (( counter++ )) done } 

然后在启动应用程序服务器之前使用check_up "DB Server" ${RABBITMQ_PORT_5672_TCP_ADDR} 5672 ,如上面的链接所述。

另一个select是使用docker-wait 。 在你的fig.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 

类似的问题,我遇到了我已经解决了使用我的Dockerfiles设置为CMD的自定义脚本。 然后,您可以运行您希望的任何检查命令(例如, sleep一段时间,或等待服务正在侦听)。 我认为没有一个标准的方法来做到这一点,无论如何,我认为最好的方式是应用程序运行可以要求外部服务启动和运行,并连接到他们,但这是不可能的案例。

为了在CI上进行testing,我们构build了一个小工具 ,可以在Docker容器中使用,以等待链接服务的准备就绪。 它会自动从其环境variables中查找所有链接的TCP服务,并重复并发地尝试build立TCP连接,直到成功或超时。

我们还写了一篇博客文章,描述我们为什么build立它,以及我们如何使用它 。