Saya menggunakan rabbitmq dan contoh python sederhana dari sini bersama dengan docker-compose. Masalah saya adalah saya harus menunggu rabbitmq untuk sepenuhnya dimulai. Dari apa yang saya cari sejauh ini, saya tidak tahu bagaimana menunggu dengan kontainer x (dalam pekerja kasus saya) sampai y (rabbitmq) dimulai.
Saya menemukan posting blog ini di mana dia memeriksa apakah host lain sedang online. Saya juga menemukan perintah buruh pelabuhan ini :
Tunggu
Penggunaan: buruh pelabuhan tunggu CONTAINER [CONTAINER ...]
Blokir hingga wadah berhenti, lalu cetak kode keluarnya.
Menunggu wadah untuk berhenti mungkin bukan yang saya cari, tetapi jika ya, apakah mungkin menggunakan perintah itu di dalam docker-compose.yml? Solusi saya sejauh ini adalah menunggu beberapa detik dan memeriksa port, tetapi apakah ini cara untuk mencapai ini? Jika saya tidak menunggu saya mendapatkan kesalahan.
docker-compose.yml
worker:
build: myapp/.
volumes:
- myapp/.:/usr/src/app:ro
links:
- rabbitmq
rabbitmq:
image: rabbitmq:3-management
contoh 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 untuk pekerja:
FROM python:2-onbuild
RUN ["pip", "install", "pika"]
CMD ["python","rabbit.py"]
Pembaruan November 2015 :
Script shell atau menunggu di dalam program Anda mungkin merupakan solusi yang mungkin. Tetapi setelah melihat Masalah ini saya mencari perintah atau fitur docker / docker-compose sendiri.
Mereka menyebutkan solusi untuk melaksanakan pemeriksaan kesehatan, yang mungkin merupakan pilihan terbaik. Koneksi tcp terbuka tidak berarti layanan Anda siap atau mungkin tetap siap. Selain itu saya perlu mengubah entri saya di dockerfile saya.
Jadi saya berharap untuk jawaban dengan komposisi buruh pelabuhan pada perintah papan, yang diharapkan akan terjadi jika mereka menyelesaikan masalah ini.
Pembaruan Maret 2016
Ada proposal untuk menyediakan cara bawaan untuk menentukan apakah sebuah wadah "hidup". Jadi komposisi buruh pelabuhan mungkin dapat menggunakannya dalam waktu dekat.
Perbarui Juni 2016
Tampaknya pemeriksaan kesehatan akan diintegrasikan ke dalam buruh pelabuhan di Versi 1.12.0
Perbarui Januari 2017
Saya menemukan solusi menyusun buruh pelabuhan lihat: Menulis Docker menunggu wadah X sebelum memulai Y