私はrabbitmqとここからの簡単なpythonサンプルをdocker -composeとともに使用しています。私の問題は、rabbitmqが完全に開始するのを待つ必要があることです。これまでに検索したものから、コンテナーx(私の場合はworker)でy(rabbitmq)が開始されるまで待機する方法がわかりません。
他のホストがオンラインであるかどうかを確認するこのブログ投稿を見つけました。私もこのdockerコマンドを見つけました:
待つ
使用法: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サンプル(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 on boardコマンドでの回答を期待しています。
2016年3月の更新
コンテナーが「生きている」かどうかを判別する組み込みの方法を提供する提案があります。そのため、docker-composeは近い将来に使用できるようになる可能性があります。
2016年6月の更新
ヘルスチェックはバージョン1.12.0のdockerに統合されるようです
2017年1月の更新
docker-composeソリューションを見つけました: Docker ComposeがコンテナXを待ってからYを開始します