我正在使用rabbitmq和一个简单的python示例以及docker-compose。我的问题是我需要等待rabbitmq 完全启动。从我到目前为止搜索的内容来看,我不知道如何等待容器 x (在我的案例工作者中)直到 y (rabbitmq)启动。
等待 用法:docker wait CONTAINER [CONTAINER…] 阻塞直到容器停止,然后打印其退出代码。
等待
用法: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中
终于找到了一个 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版):
version: '2.1' services: app: build: app/. depends_on: rabbit: condition: service_healthy links: - rabbit rabbit: build: rabbitmq/. ports: - "15672:15672" - "5672:5672" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:15672"] interval: 30s timeout: 10s retries: 5
输出:
rabbit_1 | =INFO REPORT==== 25-Jan-2017::14:44:21 === rabbit_1 | closing AMQP connection <0.718.0> (172.18.0.3:36590 -> 172.18.0.2:5672) app_1 | [x] Sent 'Hello World!' healthcheckcompose_app_1 exited with code 0
Dockerfile(rabbitmq + curl):
FROM rabbitmq:3-management RUN apt-get update RUN apt-get install -y curl EXPOSE 4369 5671 5672 25672 15671 15672
版本 3 不再支持 depends_on的条件形式。 所以我从depends_on转移到重新启动失败。现在我的应用容器将重新启动 2-3 次,直到它开始工作,但它仍然是一个 docker-compose 功能,不会覆盖入口点。
码头工人撰写(版本 3):
version: "3" services: rabbitmq: # login guest:guest image: rabbitmq:management ports: - "4369:4369" - "5671:5671" - "5672:5672" - "25672:25672" - "15671:15671" - "15672:15672" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:15672"] interval: 30s timeout: 10s retries: 5 app: build: ./app/ environment: - HOSTNAMERABBIT=rabbitmq restart: on-failure depends_on: - rabbitmq links: - rabbitmq