为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁华开满天机 2019-07-25 16:14:49
码头工人在启动Y前等待容器X我使用的是Rabbitmq和一个简单的python示例这里和码头工一起。我的问题是,我需要等待狂犬病完全开始。从我到目前为止搜索的内容来看,我不知道如何使用容器x(在我的例子中是工作者)等待,直到y(Rabbitmq)启动。我发现了这个博客检查另一个主机是否在线。我还找到了这个码头指挥:等,等候用途:码头等待容器[集装箱.]阻塞,直到容器停止为止,然后打印其退出代码。等待容器停止可能不是我想要的,但是如果是的话,是否可以在docker-come.yml中使用这个命令呢?到目前为止,我的解决方案是等待几秒钟并检查端口,但这是否实现这一目标的方法呢?如果我不等待,我就会出错。Docker-Compose.ymlworker:     build: myapp/.     volumes:     - myapp/.:/usr/src/app:ro     links:     - rabbitmq rabbitmq:     image: rabbitmq:3-managementPythonHello示例(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"]
查看完整描述

3 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

最后用对接-合成方法找到了一个解决方案。因为docker-复合文件格式2.1可以定义健康检查.

我是在示例项目您需要安装至少码头1.12.0+。我也需要扩展rabbitmq管理Dockerfile,因为卷发没有安装在官方图像上。

现在,我测试Rabbitmq容器的管理页面是否可用。如果cURL以exitcode 0结束,容器应用程序(Pythonpika)将被启动,并将消息发布到hello队列。它现在正在工作(输出)。

Docker-Composed(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不再支持取决于.所以我从“依赖”转到重新启动“失败”。现在,我的应用程序容器将重新启动2-3次直到它工作,但它仍然是一个对接-撰写功能,而不覆盖入口点。

Docker-Composed(第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




查看完整回答
反对 回复 2019-07-27
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

使用restart: unless-stoppedrestart: always可以解决这个问题。

中频工人container当RabbitMQ还没有准备好时停止,它将被重新启动直到它准备好为止。


查看完整回答
反对 回复 2019-07-27
  • 3 回答
  • 0 关注
  • 357 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信