我有一个工作群设置和滚动更新部署。由于我必须在部署后执行一些任务(比如数据库迁移),所以我在堆栈中添加了一个"manager“服务。此服务仅限于节点管理器,所以我总是有办法找到它。
要获得当前的containerID,我使用以下命令:
export MANAGER_ID=$(docker --tls ps --filter label=com.docker.swarm.service.name=projectname-php-manager -q)
这很管用..。但不是在部署的时候。
stack deploy退出到立即(在容器启动之前),甚至在管理器容器被更新之前。我还添加了一个sleep 10,用于获取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发布于 2017-11-09 16:16:16
Docker堆栈部署创建的任务试图使系统达到您希望的状态。有时任务成功,有时任务失败,调度器将生成新任务,直到系统与yml文件中描述的状态匹配为止。
坏消息是:在达到您想要的状态之前,停靠堆栈部署不支持阻塞。
在这里,一些如何使用docker和基本bash工具获取您想要的信息(您肯定可以在任何其他语言中以类似的方式实现这些信息)。
在bash中,您可以执行docker service ls --format '{{.ID}} {{.Name}}' | grep ${serviceName}来获取服务的ServiceId (这是返回的两个单词中的第一个)。
根据文档码头服务,ps做:
列出一个或多个服务的任务
此外,它还添加了一些关于任务“当前状态”的信息,即您所关心的信息。
然后使用docker service ps ${ServiceId} --format '{{.CurrentState}} {{.Image}}' | grep Running.*${newImageName}
如果此命令返回某项内容,则会有一个容器与您的新映像一起运行。( Hurray :)
我希望这能让你了解你所需要的所有工具。Docker服务ps也有助于找出任务失败的原因。
根据群任务状态文档,任务状态的可能值是:
新的任务已初始化。 为该任务分配了挂起的资源。 “指定的码头工人”将任务分配给节点。 接受任务已被员工节点接受。如果工作节点拒绝该任务,则状态更改为“拒绝”。 准备码头工人正在准备这项任务。 “启动码头工人”正在开始这项任务。 正在运行任务。 在没有错误代码的情况下完成退出的任务。 错误代码退出的任务失败。 关机码头请求关闭任务。 拒绝工作节点拒绝任务。 孤立的节点被关闭太久了。
https://stackoverflow.com/questions/47161616
复制相似问题