我正在使用rabbitmq和一个简单的python示例以及 docker -compose。我的问题是我需要等待rabbitmq 完全启动。从我到目前为止搜索的内容来看,我不知道如何等待容器 x (在我的案例工作者中)直到 y (rabbitmq)启动。
我发现了这篇 博客文章,他在其中检查其他主机是否在线。我还发现了这个 docker 命令:
等待
用法:docker wait CONTAINER [CONTAINER…]
阻塞直到容器停止,然后打印其退出代码。
等待容器停止可能不是我想要的,但如果是的话,是否可以在 docker-compose.yml 中使用该命令?到目前为止,我的解决方案是等待几秒钟并检查端口,但这是实现此目的的方法吗?如果我不等待,我会收到错误消息。
码头工人-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 on board 命令得到答案,如果他们完成了这个问题,希望会是这样。
2016 年 3 月更新
有一个 提议 提供一种内置方法来确定容器是否“活着”。所以 docker-compose 可能会在不久的将来使用它。
2016 年 6 月更新
看来healthcheck将在1.12.0版本中 集成 到docker中
2017 年 1 月更新
我找到了一个 docker-compose 解决方案,请参阅: Docker Compose 在启动 Y 之前等待容器 X
原文由 svenhornberg 发布,翻译遵循 CC BY-SA 4.0 许可协议
终于找到了一个 docker-compose 方法的解决方案。由于 docker-compose 文件格式 2.1,您可以定义 healthchecks 。
我在一个 示例项目 中做到了,您至少需要安装 docker 1.12.0+。我还需要 扩展 rabbitmq-management Dockerfile ,因为官方镜像上没有安装 curl。
现在我测试一下rabbitmq-container的管理页面是否可用。如果 curl 以 exitcode 0 结束,则将启动容器应用程序(python pika)并将消息发布到 hello 队列。它现在正在工作(输出)。
码头工人撰写(2.1版):
输出:
Dockerfile(rabbitmq + curl):
版本 3 不再支持 depends_on 的条件形式。 所以我从depends_on转移到重新启动失败。现在我的应用程序容器将重新启动 2-3 次,直到它开始工作,但它仍然是一个 docker-compose 功能,不会覆盖入口点。
码头工人撰写(版本 3):