2017-11-07 5 views
4

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 
+0

도커로 작성할 경우 컨테이너에 "depends_on"을 사용하여 "대기"할 수 있음을 알고 있습니다. https://docs.docker.com/compose/compose-file/#depends_on 가능한지 확실하지 않습니다. 스택을 배포 할 때 사용하십시오 (버전 3 Compose 파일을 사용하여 스 웜 모드로 스택을 배포 할 때는 사용할 수 없습니다). – db80

+0

docker 이미지를 차례로 실행하는 docker_compose 파일의 depends_on 속성을 사용할 수 있습니다. –

+0

depends_on은 해결책이 아닙니다. 왜냐하면 롤링 업데이트 (또는 gitlab-ci 작업)가 현재 관리자 컨테이너 실행에 의존하기 때문입니다. 다른 서비스는 신경 쓰지 않습니다. @herm이 서비스'.CurrentState'의 폴링과 함께 올바른 경로에 있다고 생각합니다. – Rufinus

답변

4

Docker stack deploy는 시스템을 원하는 상태로 만들려고하는 작업을 만듭니다. 때로는 작업이 성공하고 때로는 실패하고 오케 스트레이터는 시스템이 yml 파일에 설명 된 상태와 일치 할 때까지 새로운 작업을 생성합니다.

나쁜 소식 : 도커 스택 배포는 원하는 상태가 될 때까지 차단을 지원하지 않습니다. 여기에 몇 가지

당신은 어떻게 얻을 docker service ls --format '{{.ID}} {{.Name}}' | grep ${serviceName}을 할 수있는 당신이 (당신은 분명히 다른 언어에서 비슷한 방법으로 구현할 수)에 고정 표시기 CLI와 기본 bash는 도구 떠들썩한 파티에서

를 사용하여 원하는 정보를 얻을 수 있습니다 서비스의 서비스 id (두 단어의 첫 번째 반환의)

docs 고정 표시기 서비스 PS에 따라 수행합니다의

목록 작업 하나 이상의 서비스

또한 '현재 상태'에 대한 정보를 추가합니다.이 정보는 관심있는 정보입니다. 이 명령 반환 뭔가 새로운 이미지와 함께 실행하는 용기가 있다면

은 그럼 당신은 docker service ps ${ServiceId} --format '{{.CurrentState}} {{.Image}}' | grep Running.*${newImageName}

를 사용합니다. Hurray :)

나는 이것이 당신이 필요로하는 모든 도구를 소개하기를 바랍니다. Docker 서비스 ps는 또한 작업이 실패한 이유를 찾는 데 도움이됩니다.

FYI는 다음 Swarm task states documentation에 따른 작업 상태의 가능한 값은 :

NEW 태스크 초기화.

보류 중 작업에 대한 리소스가 할당되었습니다.

할당 됨 Docker가 작업을 노드에 할당했습니다.

ACCEPTED 작업이 작업자 노드에 의해 승인되었습니다. 작업자 노드 이 작업을 거부하면 상태가 REJECTED로 변경됩니다.

준비 도커가 작업을 준비 중입니다.

시작 도커가 작업을 시작합니다.

RUNNING 작업이 실행 중입니다.

COMPLETE 작업이 오류 코드없이 종료되었습니다.

FAILED 작업이 오류 코드와 함께 종료되었습니다.

SHUTDOWN Docker가 종료 작업을 요청했습니다.

REJECTED 작업자 노드가 작업을 거부했습니다.

ORPHANED 노드가 너무 오랫동안 작동 중지되었습니다.

+0

컨테이너가 가동 중이 라해도 응용 프로그램이 트래픽을받을 준비가되었다는 의미는 아닙니다. 신청서가 준비되었는지 확인하려면 준비가되었는지 확인하는 건강 검진이 필요합니다. – herm

관련 문제