我正在使用RabbitMQ和来自这里的简单Python示例,以及Docker Compose。我的问题是,我需要等待RabbitMQ完全启动。从我迄今为止搜索的内容来看,我不知道如何在容器x(在我的情况下是worker)等待y(RabbitMQ)启动。
我找到了这篇博客文章,在其中他检查另一个主机是否在线。我还找到了这个Docker命令:
wait
用法:docker wait CONTAINER [CONTAINER...]
阻塞,直到容器停止,然后打印其退出代码。
也许等待容器停止不是我想要的,但如果是,是否可以在docker-compose.yml中使用该命令?到目前为止,我的解决方案是等待几秒钟并检查端口,但这是达成此目的的方法吗?如果我不等待,就会出现错误。
docker-compose.yml
worker:
build: myapp/.
volumes:
- myapp/.:/usr/src/app:ro
links:
- rabbitmq
rabbitmq:
image: rabbitmq:3-management
Python初学示例(rabbit.py):
import pika
import time
import socket
pingcounter = 0
isreachable = False
while isreachable is False and pingcounter < 5:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect(('rabbitmq', 5672))
isreachable = True
except socket.error as e:
time.sleep(2)
pingcounter += 1
s.close()
if isreachable:
connection = pika.BlockingConnection(pika.ConnectionParameters(
host="rabbitmq"))
channel = connection.channel()
channel.queue_declare(queue='hello')
channel.basic_publish(exchange='',
routing_key='hello',
body='Hello World!')
print (" [x] Sent 'Hello World!'")
connection.close()
工作机器的 Dockerfile:
FROM python:2-onbuild
RUN ["pip", "install", "pika"]
CMD ["python","rabbit.py"]
2015年11月更新:
一个Shell脚本或者在你的程序中等待可能是一种可行的解决方案。但经过查看这个问题后,我正在寻找docker/docker-compose自身的命令或功能。
他们提到了一种实现健康检查的解决方案,这可能是最好的选择。一个开放的TCP连接并不意味着你的服务已经准备好或者可以保持准备状态。除此之外我还需要在我的Dockerfile中更改入口点。
因此,我希望有一个带有docker-compose内置命令的答案,如果他们完成了这个问题,那就太好了。
2016年3月更新:
有一个提议提供一种内置的方法来确定容器是否“存活”。因此,在不久的将来,docker-compose可能会利用它。
2016年6月更新:
看起来健康检查将被集成到docker 1.12.0版本中。
2017年1月更新:
我找到了一个docker-compose的解决方案,参见: Docker Compose等待容器X启动后再启动Y
healthchecks
和depends_on.condition
的支持实际上在v3中已经回归。因此,您确实可以使用它-请参见发布说明(重要的部分是它说v2和v3规范已合并)+这里是最新规范。 - aradalvand