도커 합성 버전 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_on
port.db 파일만 .
솔루션이 애플리케이션 로직에 구현되어야 한다는 데 동의하지만, 문제는 테스트를 실행하고 데이터베이스에 테스트 데이터를 미리 입력하려는 경우에만 발생합니다. "테스트가 제대로 작동하도록" 코드를 도입하는 것을 좋아하지 않기 때문에 코드 외부에서 솔루션을 구현하는 것이 더 의미가 있습니다.
솔루션:
postgres 용기에 상태 점검을 구현합니다.나에게 그것은 pid 1의 명령을 확인하는 것을 의미합니다.postgres
initdb 스크립트가 실행되는 동안 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
'bestsource' 카테고리의 다른 글
Try-except 없이 Python에서 키보드 인터럽트 (0) | 2023.09.01 |
---|---|
윈도우즈에서 OpenSSL을 사용하지 않고 pfx 파일 또는 인증서 저장소에서 개인 키 추출 (0) | 2023.09.01 |
[asyncError()] 호출이 비동기 상태 [MUST_DISPATCH]인 요청에 대해 유효하지 않습니다. (0) | 2023.09.01 |
mysqld 서비스는 ec2 서버에서 하루에 한 번 중지됩니다. (0) | 2023.09.01 |
Spring Rest Template를 사용하여 Https Rest 서비스 액세스 (0) | 2023.09.01 |