猿问

码头工人在启动Y前等待容器X

码头工人在启动Y前等待容器X

我使用的是Rabbitmq和一个简单的python示例这里和码头工一起。我的问题是,我需要等待狂犬病完全开始。从我到目前为止搜索的内容来看,我不知道如何使用容器x(在我的例子中是工作者)等待,直到y(Rabbitmq)启动。

我发现了这个博客检查另一个主机是否在线。我还找到了这个码头指挥:

等,等候

用途:码头等待容器[集装箱.]

阻塞,直到容器停止为止,然后打印其退出代码。

等待容器停止可能不是我想要的,但是如果是的话,是否可以在docker-come.yml中使用这个命令呢?到目前为止,我的解决方案是等待几秒钟并检查端口,但这是否实现这一目标的方法呢?如果我不等待,我就会出错。

Docker-Compose.yml

worker:
    build: myapp/.
    volumes:
    - myapp/.:/usr/src/app:ro

    links:
    - rabbitmq
rabbitmq:
    image: rabbitmq:3-management

PythonHello示例(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()

工人文件:

FROM python:2-onbuild
RUN ["pip", "install", "pika"]

CMD ["python","rabbit.py"]


繁华开满天机
浏览 358回答 3
3回答

慕村225694

最后用对接-合成方法找到了一个解决方案。因为docker-复合文件格式2.1可以定义健康检查.我是在示例项目您需要安装至少码头1.12.0+。我也需要扩展rabbitmq管理Dockerfile,因为卷发没有安装在官方图像上。现在,我测试Rabbitmq容器的管理页面是否可用。如果cURL以exitcode 0结束,容器应用程序(Pythonpika)将被启动,并将消息发布到hello队列。它现在正在工作(输出)。Docker-Composed(2.1版):version:&nbsp;'2.1' services: &nbsp;&nbsp;app: &nbsp;&nbsp;&nbsp;&nbsp;build:&nbsp;app/. &nbsp;&nbsp;&nbsp;&nbsp;depends_on: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rabbit: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;condition:&nbsp;service_healthy &nbsp;&nbsp;&nbsp;&nbsp;links:&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;rabbit &nbsp;&nbsp;rabbit: &nbsp;&nbsp;&nbsp;&nbsp;build:&nbsp;rabbitmq/. &nbsp;&nbsp;&nbsp;&nbsp;ports:&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;"15672:15672" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;"5672:5672" &nbsp;&nbsp;&nbsp;&nbsp;healthcheck: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test:&nbsp;["CMD",&nbsp;"curl",&nbsp;"-f",&nbsp;"http://localhost:15672"] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interval:&nbsp;30s &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeout:&nbsp;10s &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retries:&nbsp;5产出:rabbit_1&nbsp;&nbsp;|&nbsp;=INFO&nbsp;REPORT====&nbsp;25-Jan-2017::14:44:21&nbsp;=== rabbit_1&nbsp;&nbsp;|&nbsp;closing&nbsp;AMQP&nbsp;connection&nbsp;<0.718.0>&nbsp;(172.18.0.3:36590&nbsp;->&nbsp;172.18.0.2:5672) app_1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;[x]&nbsp;Sent&nbsp;'Hello&nbsp;World!' healthcheckcompose_app_1&nbsp;exited&nbsp;with&nbsp;code&nbsp;0Dockerfile(rabbitmq+curl):FROM&nbsp;rabbitmq:3-management RUN&nbsp;apt-get&nbsp;update RUN&nbsp;apt-get&nbsp;install&nbsp;-y&nbsp;curl&nbsp; EXPOSE&nbsp;4369&nbsp;5671&nbsp;5672&nbsp;25672&nbsp;15671&nbsp;15672版本3不再支持取决于.所以我从“依赖”转到重新启动“失败”。现在,我的应用程序容器将重新启动2-3次直到它工作,但它仍然是一个对接-撰写功能,而不覆盖入口点。Docker-Composed(第3版):version:&nbsp;"3" services: &nbsp;&nbsp;rabbitmq:&nbsp;#&nbsp;login&nbsp;guest:guest &nbsp;&nbsp;&nbsp;&nbsp;image:&nbsp;rabbitmq:management &nbsp;&nbsp;&nbsp;&nbsp;ports: &nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;"4369:4369" &nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;"5671:5671" &nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;"5672:5672" &nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;"25672:25672" &nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;"15671:15671" &nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;"15672:15672" &nbsp;&nbsp;&nbsp;&nbsp;healthcheck: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test:&nbsp;["CMD",&nbsp;"curl",&nbsp;"-f",&nbsp;"http://localhost:15672"] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interval:&nbsp;30s &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeout:&nbsp;10s &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retries:&nbsp;5 &nbsp;&nbsp;app: &nbsp;&nbsp;&nbsp;&nbsp;build:&nbsp;./app/ &nbsp;&nbsp;&nbsp;&nbsp;environment: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;HOSTNAMERABBIT=rabbitmq &nbsp;&nbsp;&nbsp;&nbsp;restart:&nbsp;on-failure &nbsp;&nbsp;&nbsp;&nbsp;depends_on: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;rabbitmq &nbsp;&nbsp;&nbsp;&nbsp;links:&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;rabbitmq

慕妹3146593

使用restart: unless-stopped或restart: always可以解决这个问题。中频工人container当RabbitMQ还没有准备好时停止,它将被重新启动直到它准备好为止。
随时随地看视频慕课网APP
我要回答