bestsource

도커 합성 버전 3에서 depends_on의 조건 형식에 대한 대안은 무엇입니까?

bestsource 2023. 9. 1. 21:12
반응형

도커 합성 버전 3에서 depends_on의 조건 형식에 대한 대안은 무엇입니까?

도커 2.1 다같 2.1 은은 제기다를 수 좋은 을 제공합니다.condition와 함께depends_on현재 도커 구성 설명서에는 다음과 같은 내용이 문서는 다음과 같습니다.

버전 3에서는 depends_on의 조건 형식을 더 이상 지원하지 않습니다.

불행하게도 문서는 설명하지 않습니다, 왜.condition양식이 제거되었으며 V3를 위쪽으로 사용하여 해당 동작을 구현하는 방법에 대한 구체적인 권장 사항이 없습니다.

작성 시 컨테이너 종속성을 지정하지 않았습니다.이러한 컨테이너는 시작 시에만 유효하며 실행 시 종속 컨테이너가 다시 시작되면 작동하지 않습니다.대신 각 컨테이너에는 연결이 끊어졌을 때 종속 서비스에 다시 연결하기 위해 재시도하는 메커니즘이 포함되어야 합니다.데이터베이스 또는 REST API 서비스에 연결하는 많은 라이브러리에는 구성 가능한 내장 재시도가 있습니다.제가 알아보겠습니다.어쨌든 생산 코드에 필요합니다.

1.27.0부터는 2.x 및 3.x가 COMPOSE_SPEC 스키마와 병합됩니다.

버전은 이제 선택 사항입니다.따라서 이전과 같이 제거하고 조건을 지정하면 됩니다.

services:
  web:
    build: .
    depends_on:
      redis:
        condition: service_healthy
  redis:
    image: redis
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 1s
      timeout: 3s
      retries: 30

이 동작을 모방할 수 있는 몇 가지 외부 도구가 있습니다.예를 들어, 도커라이즈 도구를 사용하여 파일을 포장할 수 있습니다.CMD또는ENTRYPOINT와 함께dockerize -wait지정된 서비스가 준비될 때까지 응용프로그램을 실행할 수 없습니다.

도커 합성 파일이 이전에는 다음과 같이 표시되었습니다.

version: '2.1'
services:
  kafka:
    image: spotify/kafka
    healthcheck:
      test: nc -z localhost 9092
  webapp:
     image: foo/bar # your image
     healthcheck:
       test: curl -f http://localhost:8080
  tests:
     image: bar/foo # your image
     command: YOUR_TEST_COMMAND
     depends_on:
       kafka:
         condition: service_healthy
       webapp:
         condition: service_healthy

그러면 사용할 수 있습니다.dockerize의 신의에v3다음과 같은 파일 작성:

version: '3.0'
services:
  kafka:
    image: spotify/kafka
  webapp:
     image: foo/bar # your image
  tests:
     image: bar/foo # your image
     command: dockerize -wait tcp://kafka:9092 -wait web://webapp:8080 YOUR_TEST_COMMAND

시작하기 전에 init sql 스크립트가 완료될 때까지 기다리는 애플리케이션이 필요한 도커 합성을 통해 postgres 및 애플리케이션을 실행할 때 사용할 솔루션을 추가해야 한다고 생각했습니다.

도커라이즈는 db 포트를 사용할 수 있기를 기다리는 것처럼 보입니다(포트 5432). 이는 다음과 같습니다.depends_on 3도커 3:도커 3에서 사용할 수.

version: '3'

services:
  app:
    container_name: back-end
    depends_on:
      - postgres
  postgres:
    image: postgres:10-alpine
    container_name: postgres
    ports:
      - "5432:5432"
    volumes:
      - ./docker-init:/docker-entrypoint-initdb.d/

문제:

됩니다. " " " " " " " " " " " " " " " " " " " " " 이 됩니다.depends_onport.db 파일만 .

솔루션이 애플리케이션 로직에 구현되어야 한다는 데 동의하지만, 문제는 테스트를 실행하고 데이터베이스에 테스트 데이터를 미리 입력하려는 경우에만 발생합니다. "테스트가 제대로 작동하도록" 코드를 도입하는 것을 좋아하지 않기 때문에 코드 외부에서 솔루션을 구현하는 것이 더 의미가 있습니다.

솔루션:

postgres 용기에 상태 점검을 구현합니다.나에게 그것은 pid 1의 명령을 확인하는 것을 의미합니다.postgresinitdb 스크립트가 실행되는 동안 pid 1에서 다른 명령을 실행할 것이기 때문입니다.

애플리케이션 측에서 대기할 스크립트 작성postgres되기 위해healthy스크립트는 다음과 같습니다.

#!/bin/bash
function check {
  STATUS=\`curl -s --unix-socket /var/run/docker.sock http:/v1.24/containers/postgres/json | python -c 'import sys, json; print json.load('sys.stdin')["State"]["Health"]["Status"]'\`

  if [ "$STATUS" = "healthy" ]; then
    return 0
  fi
  return 1
}

until check; do
  echo "Waiting for postgres to be ready"
  sleep 5
done

echo "Postgres ready"

그런 다음 Docker-compose는 응용 프로그램에 대한 Docker 파일을 편집하지 않도록 스크립트의 디렉터리를 마운트해야 하며, 사용자 지정 Postgres 이미지를 사용하는 경우 이러한 방식으로 게시된 이미지에 대한 Docker 파일을 계속 사용할 수 있습니다.

또한 앱이 시작되기 전에 대기 스크립트를 실행할 수 있도록 앱의 도커 파일에 정의된 진입점을 재정의하고 있습니다.

version: '3'

services:
  app:
    container_name: back-end
    entrypoint: ["/bin/sh","-c","/opt/app/wait/wait-for-postgres.sh && <YOUR_APP_START_SCRIPT>"]
    depends_on:
      - postgres
    volumes:
      - //var/run/docker.sock:/var/run/docker.sock
      - ./docker-scripts/wait-for-postgres:/opt/app/wait
  postgres:
    image: postgres:10-alpine
    container_name: postgres
    ports:
      - "5432:5432"
    volumes:
      - ./docker-init:/docker-entrypoint-initdb.d/
      - ./docker-scripts/postgres-healthcheck:/var/lib
    healthcheck:
      test: /var/lib/healthcheck.sh
      interval: 5s
      timeout: 5s
      retries: 10

만약 누군가가 찾고 있는 경우docker stack버전:

현재 도커 스택을 사용할 때 종속성을 정의할 수 없는 것 같습니다. https://github.com/docker/cli/issues/3880

한 컨테이너가 다른 컨테이너를 기다리지 않고 실행해야 했기 때문에 이 페이지에 도달했습니다.docker system prune그것을 작동시키기 위해.거기에는orphaned container실행을 재촉한 오류prune.

언급URL : https://stackoverflow.com/questions/47710767/what-is-the-alternative-to-condition-form-of-depends-on-in-docker-compose-versio

반응형