1. ホーム

[解決済み】Docker ComposeはYを起動する前にコンテナXを待ちます。

2022-03-24 15:08:32

質問

私はrabbitmqを使用しており、以下の簡単なPythonサンプルを使用しています。 ここで をdocker-composeと一緒に使っています。私の問題は、rabbitmqが完全に開始されるのを待つ必要があることです。これまで検索した限りでは、y(rabbitmq)が起動するまでコンテナx(私の場合はworker)で待機する方法がわかりません。

こんなの見つけた ブログ記事 を使い、他のホストがオンラインであるかどうかをチェックしています。 また、次のようなものもありました。 ドッカーコマンド :

待つ

使用法: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 sample (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()

Worker 用の Dockerfile。

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

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

2015年11月更新 :

シェルスクリプトやプログラム内での待機は、もしかしたら可能な解決策かもしれません。しかし、これを見た後では 課題 docker/docker-compose自体のコマンドや機能を探しています。

ヘルスチェックを実装するためのソリューションに言及していますが、これは最良の選択肢かもしれません。tcp接続が開いていても、サービスの準備が整っているとは限りませんし、準備が整ったままである可能性もあります。さらに、dockerfileのエントリポイントを変更する必要があります。

だから、私はdocker-composeオンボードのコマンドで答えを期待しています、それはうまくいけば、彼らがこの問題を完了する場合です。

2016年3月更新

があります。 提案 コンテナが生きているかどうかを判断するための組み込みの方法を提供するためのものです。docker-composeは近い将来それを利用できるようになるかもしれません。

2016年6月更新

ヘルスチェックが行われるようです 統合 バージョン1.12.0ではdockerに

2017年1月更新

docker-composeの解決策を見つけましたのでご覧ください。 Docker Compose は Y を起動する前にコンテナ X を待ちます。

どのように解決するのですか?

docker-composeのメソッドでようやく解決しました。docker-composeファイルフォーマット2.1では ヘルスチェック .

でやってみた。 サンプルプロジェクト の場合、少なくともdocker 1.12.0+をインストールする必要があります。 また rabbitmq-managementのDockerfileを拡張します。 というのも、公式イメージにはcurlがインストールされていないのです。

ここで、rabbitmq-containerの管理ページが利用可能かどうかテストしてみます。もしcurlがexitcode 0で終了したら、コンテナアプリ(python pika)が起動し、helloキューにメッセージをパブリッシュします。これで動作するようになりました(出力)。

docker-compose (バージョン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からrestart on-failure に移行しました。これで私のアプリコンテナは動作するようになるまで2-3回再起動しますが、エントリポイントを上書きすることなくdocker-composeの機能として残っています。

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