【发布时间】:2015-10-23 03:12:16
【问题描述】:
我正在使用 rabbitmq 和来自here 的简单 python 示例 与 docker-compose 一起使用。我的问题是我需要等待rabbitmq 完全启动。从我到目前为止搜索的内容来看,我不知道如何等待容器 x(在我的案例工作者中)直到 y (rabbitmq) 启动。
我发现了这个blog post,他在其中检查其他主机是否在线。 我还发现了这个docker command:
等待
用法: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 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 脚本或在程序中等待可能是一种可能的解决方案。但是在看到这个Issue 之后,我正在寻找 docker/docker-compose 本身的命令或功能。
他们提到了实施健康检查的解决方案,这可能是最佳选择。打开的 tcp 连接并不意味着您的服务已准备好或可能保持准备就绪。除此之外,我还需要更改 dockerfile 中的入口点。
所以我希望通过 docker-compose on board 命令得到答案,如果他们完成了这个问题,希望会是这样。
2016 年 3 月更新
proposal 提供了一种内置方法来确定容器是否“活动”。所以 docker-compose 可能在不久的将来可以使用它。
2016 年 6 月更新
在版本 1.12.0 中,似乎健康检查将 integrated 进入 docker
2017 年 1 月更新
我找到了一个 docker-compose 解决方案,请参阅: Docker Compose wait for container X before starting Y
【问题讨论】:
-
在 docker-compose 2.3 中不推荐使用健康检查,以鼓励分布式系统容错。见:docs.docker.com/compose/startup-order
-
我已经多次遇到这个问题。你可以克服它,但 docker-compose 会在每一步都与你抗争。如果你想要 setup-test-teardown 容器控制,你最好使用像conducto这样的东西。
标签: docker-compose