Docker Swarm部署 – 等待服务/容器出现

我有一个工作群设置和滚动更新部署。 由于我不得不在部署后执行一些任务(如数据库迁移),我添加了一个“经理”服务到堆栈。 此服务仅限于节点pipe理器 – 所以我总是有办法find它。

要获取当前的容器ID我使用这个命令:
export MANAGER_ID=$(docker --tls ps --filter label=com.docker.swarm.service.name=projectname-php-manager -q)

这工作…但不在部署期间。

stack deploy即将退出(容器已启动),甚至是pipe理器容器得到更新。 我还添加了一个sleep 10 befor geting的containerID,但结果不尽相同。

有没有办法等待或知道何时部署特定的服务?

完整的部署看起来像这样(在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堆栈部署创build了一些任务,试图让系统达到你想要的状态。 有时候任务会成功,有时会失败,编排器会生成新的任务,直到系统与您的yml文件中描述的状态相匹配。

坏消息是: 在达到你想要的状态之前,docker stack deploy不支持阻塞。

这里有一些如何使用docker cli和基本的bash工具来获得你想要的信息(你可以用类似的方式用其他语言来实现)

在bash中,你可以做docker service ls --format '{{.ID}} {{.Name}}' | grep ${serviceName} docker service ls --format '{{.ID}} {{.Name}}' | grep ${serviceName}得到你的服务的ServiceId(它返回的两个单词中的第一个)

根据文档泊坞窗服务ps做:

列出一项或多项服务的任务

此外,它还增加了一些有关任务“当前状态”的信息,这是您关心的信息。

然后你使用docker service ps ${ServiceId} --format '{{.CurrentState}} {{.Image}}' | grep Running.*${newImageName} docker service ps ${ServiceId} --format '{{.CurrentState}} {{.Image}}' | grep Running.*${newImageName}

如果这个命令返回的东西有一个容器与你的新形象运行。 华友世纪:)

我希望这会向您介绍所有你需要的工具。 Docker服务ps也可以帮助您找出任务失败的原因。

仅供参考:根据Swarm任务状态文档 ,任务状态的可能值为:

新任务已初始化。

待办事项资源分配。

ASSIGNED Docker将任务分配给节点。

接受该任务被工作节点接受。 如果工作节点拒绝任务,状态将更改为“拒绝”。

准备Docker正在准备任务。

启动Docker正在启动任务。

正在执行任务正在执行。

完成任务退出,没有错误代码。

失败任务退出并显示错误代码。

SHUTDOWN Docker请求任务closures。

拒绝工作者节点拒绝了任务。

ORPHANED节点停机时间太长。