【发布时间】:2018-04-20 01:44:09
【问题描述】:
我有一个工作群设置和滚动更新部署。因为我必须在部署后执行一些任务(比如数据库迁移),所以我向堆栈添加了一个“管理器”服务。此服务仅限于节点管理器 - 所以我总有办法找到它。
要获取当前的 containerID,我使用以下命令:export MANAGER_ID=$(docker --tls ps --filter label=com.docker.swarm.service.name=projectname-php-manager -q)
这有效...但在部署期间无效。
stack deploy 很快就会退出(在容器启动之前),甚至在管理器容器更新之前。
在获取 containerID 之前,我还添加了 sleep 10,但结果各不相同。
有没有办法等待或知道何时部署特定服务?
完整的部署看起来像这样(在 gitlab-ci 工作中完成 - 但这不是问题的根源):
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
部分来自 docker-compose.prod.yml:
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
【问题讨论】:
-
我知道使用 docker compose 你可以使用“depends_on”来“等待”一个容器:docs.docker.com/compose/compose-file/#depends_on我不确定你在部署堆栈时是否可以使用它(当然你在使用版本 3 Compose 文件以 swarm 模式部署堆栈时无法使用它。)
-
您可以在 docker_compose 文件中使用depends_on 属性,该属性一个接一个地执行 docker 图像。
-
depends_on 不是解决方案。因为对于滚动更新,我(或 gitlab-ci 作业)依赖于运行当前的管理器容器。其他服务不关心它。我认为@herm 在服务
.CurrentState的轮询中走在了正确的轨道上,我会试一试。 -
堆栈部署也不支持“depends_on”
-
有一个open issue 可以将此功能添加到
docker stack deploy。
标签: docker continuous-deployment docker-swarm