[docker-compose] Docker Compose는 Y를 시작하기 전에 컨테이너 X를 기다립니다.

여기 에서 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 필요한 모든 서비스가있을 때까지 .

에서 DockerfileCMD 당신은 랩이 컨테이너 서비스를 시작하는 것을 자신의 시작 스크립트를 참조 할 수있다. 시작하기 전에 다음과 같은 종속 항목을 기다립니다.

도커 파일

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해결할 수 있습니다.

containerrabbitMQ가 준비되지 않은 상태에서 작업자 가 중지되면 완료 될 때까지 다시 시작됩니다.


답변

최근에 그들은 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/에 도움이
됩니다.