Docker Compose はコンテナ X が Y を開始するまで待機します。質問する

Docker Compose はコンテナ X が Y を開始するまで待機します。質問する

私はrabbitmqと簡単なpythonサンプルを使用していますここdocker-compose と一緒に。私の問題は、rabbitmq が完全に起動するまで待つ必要があることです。これまで調べた限りでは、コンテナー x (私の場合はワーカー) が y (rabbitmq) が起動するまで待つ方法がわかりません。

私はこれを見つけましたブログ投稿ここで彼は他のホストがオンラインかどうかを確認します。私はこれも見つけましたdocker コマンド:

待って

使用方法: docker wait CONTAINER [CONTAINER...]

コンテナが停止するまでブロックし、終了コードを出力します。

コンテナが停止するのを待つことは、おそらく私が探しているものではないのですが、もしそうなら、docker-compose.yml 内でそのコマンドを使用することは可能ですか? これまでの私の解決策は、数秒待ってポートを確認することですが、これはこれを実現する方法でしょうか? 待たないと、エラーが発生します。

ドッカー

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

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

python hello サンプル (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月更新:

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

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

したがって、私は docker-compose オンボード コマンドによる回答を期待しています。この問題が解決されれば、そうなることを願っています。

2016年3月更新

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

2016年6月更新

健康診断は統合されたバージョン1.12.0のdockerに

2017年1月更新

docker-compose ソリューションを見つけました。以下を参照してください。Docker Compose はコンテナ X が Y を開始するまで待機します。

ベストアンサー1

ついにdocker-composeメソッドで解決策を見つけました。docker-composeファイル形式2.1以降では、ヘルスチェック

私はサンプルプロジェクト少なくともdocker 1.12.0以上をインストールする必要があります。rabbitmq-management Dockerfileを拡張する公式イメージには curl がインストールされていないためです。

ここで、rabbitmq-container の管理ページが利用可能かどうかをテストします。curl が終了コード 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

おすすめ記事