swarm setup 및 rolling-updates deployment가 있습니다. 배포 후 (데이터베이스 마이그레이션과 같은) 일부 작업을 수행해야하므로 스택에 "관리자"서비스를 추가했습니다. 이 서비스는 노드 관리자에게만 국한되어 있으므로 항상 찾을 수있는 방법이 있습니다. 배포시이 작동
export MANAGER_ID=$(docker --tls ps --filter label=com.docker.swarm.service.name=projectname-php-manager -q)
Docker Swarm deploy - 서비스/컨테이너가 제공 될 때까지 기다립니다.
...하지만 :
내가이 명령을 사용하여 현재 containerID를 얻으려면.stack deploy
은 곧 종료되며 (컨테이너가 올라 오면) 또는 관리자 컨테이너가 업데이트 될 때까지 종료됩니다. 컨테이너 ID를 얻으려면 sleep 10
을 추가했지만 결과는 다양합니다.
특정 서비스가 배포 될 때까지 기다리거나 알 수있는 방법이 있습니까?
는 전체 배포는 다음과 같습니다 (A gitlab-CI 작업에서 수행 - 그러나 이것은 문제의 루트가 아닌) : 고정 표시기 - compose.prod.yml에서
deploy:staging:
variables:
DOCKER_HOST: "tcp://swarm-manager.hostname.tld:2376"
DOCKER_CERT_PATH: "/home/gitlab-runner/docker/swarm-manager.hostname.tld"
VERSION_TAG: "$CI_COMMIT_TAG"
MYSQL_PROD_PASSWORD: "$MYSQL_PROD_PASSWORD"
SECRET_TOKEN: "$SECRET_TOKEN"
script:
- docker --tls stack deploy -c docker-compose.prod.yml project-name --with-registry-auth --prune
- sleep 10
- export MANAGER_ID=$(docker --tls ps --filter label=com.docker.swarm.service.name=project-name_php-manager -q)
- docker --tls exec -t $MANAGER_ID bin/console doctrine:migrations:migrate --no-interaction --allow-no-migration
stage: deploy
environment:
name: staging
url: http://projectname.com
only: [tags]
cache: ~
dependencies:
- build:app
tags:
- deploy
부 :
php-manager:
image: dockerhub.mydomain.tld/namespace/projectname/php:${VERSION_TAG}
environment:
DATABASE_URL: "mysql://projectname:${MYSQL_PROD_PASSWORD}@mysql:3306/projectname?charset=utf8mb4&serverVersion=5.7"
APP_ENV: prod
APP_SECRET: "${SECRET_TOKEN}"
VERSION: "${VERSION_TAG}"
REDIS_HOST: redis
networks:
- default
deploy:
placement:
constraints: [node.role == manager]
replicas: 1
restart_policy:
condition: on-failure
도커로 작성할 경우 컨테이너에 "depends_on"을 사용하여 "대기"할 수 있음을 알고 있습니다. https://docs.docker.com/compose/compose-file/#depends_on 가능한지 확실하지 않습니다. 스택을 배포 할 때 사용하십시오 (버전 3 Compose 파일을 사용하여 스 웜 모드로 스택을 배포 할 때는 사용할 수 없습니다). – db80
docker 이미지를 차례로 실행하는 docker_compose 파일의 depends_on 속성을 사용할 수 있습니다. –
depends_on은 해결책이 아닙니다. 왜냐하면 롤링 업데이트 (또는 gitlab-ci 작업)가 현재 관리자 컨테이너 실행에 의존하기 때문입니다. 다른 서비스는 신경 쓰지 않습니다. @herm이 서비스'.CurrentState'의 폴링과 함께 올바른 경로에 있다고 생각합니다. – Rufinus