我正在从这里使用Rabbitmq和一个简单的python示例以及docker -compose。我的问题是我需要等待rabbitmq完全启动。从到目前为止的搜索结果来看,我不知道如何等待容器x(在我的情况下为worker)启动y(rabbitmq)。
我发现此博文中他检查其他主机是否在线。我还发现了这个docker命令:
等待
用法:泊坞窗等待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 hello示例(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 on board命令有一个答案,希望他们能解决此问题。
2016年3月更新
有提议提供一种确定容器是否“有效”的内置方式。因此,docker-compose可能会在不久的将来使用它。
2016年6月更新
健康检查似乎将在1.12.0版中集成到docker中
2017年1月更新
我找到了一个docker-compose解决方案,请参阅: Docker Compose在开始Y之前等待容器X