[解決済み】Docker ComposeはYを起動する前にコンテナXを待ちます。
質問
私は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
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン