Я використовую RabbitMQ і простий зразок пітона з тут разом з Докером-композит. Моя проблема полягає в тому, що мені потрібно дочекатися завершення роботи rabbitmq. З того, що я шукав до цих пір, я не знаю, як чекати з контейнером x (у моєму випадку працівник), поки не почнеться y (rabbitmq).
Я знайшов цей блог, де він перевіряє, чи є інший хост в Інтернеті. Я також знайшов цю команду docker :
чекати
Використання: докер чекати CONTAINER [CONTAINER ...]
Блокуйте, поки контейнер не зупиниться, а потім надрукуйте його вихідний код.
Очікування зупинки контейнера - це, можливо, не те, що я шукаю, але якщо він є, чи можливо використовувати цю команду всередині docker-compose.yml? Моє рішення поки що - почекати кілька секунд і перевірити порт, але чи це спосіб досягти цього? Якщо я не чекаю, я отримую помилку.
docker-compose.yml
worker:
build: myapp/.
volumes:
- myapp/.:/usr/src/app:ro
links:
- rabbitmq
rabbitmq:
image: rabbitmq:3-management
зразок пітона привіт (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()
Докерфайл для працівника:
FROM python:2-onbuild
RUN ["pip", "install", "pika"]
CMD ["python","rabbit.py"]
Оновити листопад 2015 року :
Сценарій оболонки або очікування всередині вашої програми - можливо, можливе рішення. Але побачивши цей випуск, я шукаю команду чи функцію docker / docker-compose.
Вони згадують рішення щодо здійснення медичної перевірки, яке може бути найкращим варіантом. Відкрите з'єднання tcp не означає, що ваша послуга готова або може залишатися готовою. На додаток до цього мені потрібно змінити вхідну точку в моєму докерфілі.
Тож я сподіваюся на відповідь командами докер-композиції на борту команд, що, сподіваємось, випадок, якщо вони закінчать цю проблему.
Оновлення березня 2016 року
Є пропозиція щодо вбудованого способу визначення того, чи є контейнер "живим". Тож докер-композит може, можливо, скористатися ним найближчим часом.
Оновлення червня 2016 року
Здається, що перевірка стану здоров'я буде інтегрована у докер у версії 1.12.0
Оновлення січня 2017 року
Я знайшов рішення для створення докерів, див.: Docker Compose зачекайте контейнера X перед запуском Y