여기 에서 dockm
-compose와 함께 rabbitmq와 간단한 파이썬 샘플을 사용하고 있습니다 . 내 문제는 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 샘플 (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에서 상태 점검이 도커에 통합 된 것으로 보입니다.
2017 년 1 월 업데이트
도커 작성 솔루션을 찾았습니다
.Docker Compose는 Y를 시작하기 전에 컨테이너 X를 기다립니다.
답변
마지막으로 docker-compose 방법으로 솔루션을 찾았습니다. docker-compose 파일 형식 2.1 이후로 정의 할 수 있습니다 상태 확인 .
나는 예제 프로젝트 에서 그것을했다
는 1.12.0+ 적어도 고정 표시기에 설치해야합니다. curl이 공식 이미지에 설치되어 있지 않기 때문에 rabbitmq 관리 Dockerfile 을 확장 해야했습니다 .
이제 rabbitmq-container의 관리 페이지가 사용 가능한지 테스트합니다. curl이 종료 코드 0으로 끝나면 컨테이너 응용 프로그램 (python pika)이 시작되고 hello queue에 메시지가 게시됩니다. 이제 작동합니다 (출력).
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은 더 이상 depend_on 조건 양식을 지원하지 않습니다 .
따라서 depend_on에서 실패시 다시 시작했습니다. 이제 내 응용 프로그램 컨테이너가 작동 할 때까지 2-3 번 다시 시작되지만 여전히 진입 점을 덮어 쓰지 않고 도커 작성 기능입니다.
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
답변
기본적으로 아직 불가능합니다. 이 기능 요청 참조 .
지금까지 컨테이너에서 그렇게해야합니다. CMD
필요한 모든 서비스가있을 때까지 .
에서 Dockerfile
의CMD
당신은 랩이 컨테이너 서비스를 시작하는 것을 자신의 시작 스크립트를 참조 할 수있다. 시작하기 전에 다음과 같은 종속 항목을 기다립니다.
도커 파일
FROM python:2-onbuild
RUN ["pip", "install", "pika"]
ADD start.sh /start.sh
CMD ["/start.sh"]
start.sh
#!/bin/bash
while ! nc -z rabbitmq 5672; do sleep 3; done
python rabbit.py
아마 당신은에 netcat을 설치해야합니다 Dockerfile
에게도 . 파이썬 이미지에 사전 설치된 것이 무엇인지 모르겠습니다.
간단한 tcp 포트 검사를 위해 사용하기 쉬운 대기 로직을 제공하는 몇 가지 도구가 있습니다.
더 복잡한 대기의 경우 :
답변
이 문제를 사용 restart: unless-stopped
하거나 restart: always
해결할 수 있습니다.
container
rabbitMQ가 준비되지 않은 상태에서 작업자 가 중지되면 완료 될 때까지 다시 시작됩니다.
답변
최근에 그들은 depends_on
기능을 추가했습니다 .
편집하다:
작성 버전 2.1 이상 depends_on
에서 healthcheck
이를 달성하기 위해 함께 사용할 수 있습니다 .
문서에서 :
version: '2.1'
services:
web:
build: .
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
redis:
image: redis
db:
image: redis
healthcheck:
test: "exit 0"
버전 2.1 이전
계속 사용할 수는 depends_on
있지만 종속 서비스가 시작되기 전에 준비된 경우가 아니라 서비스 시작 순서 에만 영향을줍니다 .
버전 1.6.0 이상이 필요한 것 같습니다.
사용법은 다음과 같습니다.
version: '2'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
문서에서 :
서비스 간 특급 종속성. 두 가지 영향이 있습니다.
- docker-compose up은 종속성 순서대로 서비스를 시작합니다. 다음 예에서 db 및 redis는 웹보다 먼저 시작됩니다.
- docker-compose up SERVICE는 SERVICE의 종속성을 자동으로 포함합니다. 다음 예제에서 docker-compose up 웹은 db 및 redis를 생성하고 시작합니다.
참고 : 이해하지만 컨테이너가로드되는 순서가 설정됩니다. 컨테이너 내부의 서비스가 실제로로드되었다는 보장은 없습니다.
예를 들어, postgres 컨테이너 가 작동했을 수 있습니다. 그러나 postgres 서비스 자체는 여전히 컨테이너 내에서 초기화되고있을 수 있습니다.
답변
예를 들어 명령 옵션에 추가 할 수도 있습니다.
command: bash -c "sleep 5; start.sh"
https://github.com/docker/compose/issues/374#issuecomment-156546513
포트에서 기다리려면 다음과 같이 사용할 수도 있습니다
command: bash -c "while ! curl -s rabbitmq:5672 > /dev/null; do echo waiting for xxx; sleep 3; done; start.sh"
대기 시간을 늘리려면 조금 더 해킹 할 수 있습니다.
command: bash -c "for i in {1..100} ; do if ! curl -s rabbitmq:5672 > /dev/null ; then echo waiting on rabbitmq for $i seconds; sleep $i; fi; done; start.sh"
답변
restart: on-failure
나를 위해 속임수를 썼다. 아래 참조
---
version: '2.1'
services:
consumer:
image: golang:alpine
volumes:
- ./:/go/src/srv-consumer
working_dir: /go/src/srv-consumer
environment:
AMQP_DSN: "amqp://guest:guest@rabbitmq:5672"
command: go run cmd/main.go
links:
- rabbitmq
restart: on-failure
rabbitmq:
image: rabbitmq:3.7-management-alpine
ports:
- "15672:15672"
- "5672:5672"
답변
컨테이너 시작 주문 용
depends_on:
이전 컨테이너 시작 대기 스크립트
entrypoint: ./wait-for-it.sh db:5432
이 기사는 https://docs.docker.com/compose/startup-order/에 도움이
됩니다.