【问题标题】:docker stack deploy does not update configdocker stack deploy 不更新配置
【发布时间】:2021-04-06 19:43:37
【问题描述】:

尝试使用 docker stack deploy、docker swarm 一个节点 localhost 环境设置零停机部署。

在构建映像demo:latest 后,使用命令docker stack deploy --compose-file docker-compose.yml demo 进行的第一次部署能够看到4 个副本正在运行,并且可以访问我本地机器上端口8080 上的nginx 默认主页。现在更新index.html,构建具有相同名称和标签的镜像,运行 docker stack deplopy 命令导致以下错误并且未反映更改。

删除部署并重新创建将起作用,但我正在尝试查看如何在不停机的情况下进行更新。请在这里帮忙。

错误

Updating service demo_demo (id: wh5jcgirsdw27k0v1u5wla0x8)
image demo:latest could not be accessed on a registry to record
its digest. Each node will access demo:latest independently,
possibly leading to different nodes running different
versions of the image.

Dockerfile

FROM nginx:1.19-alpine
ADD index.html /usr/share/nginx/html/

docker-compose.yml

version: "3.7"
services:
  demo:
    image: demo:latest
    ports:
      - "8080:80"
    deploy:
      replicas: 4
      update_config:
        parallelism: 2
        order: start-first
        failure_action: rollback
        delay: 10s
      rollback_config:
        parallelism: 0
        order: stop-first

【问题讨论】:

    标签: docker docker-compose docker-swarm


    【解决方案1】:

    TLDR:构建后将映像推送到注册表

    如果没有公共或私有 Docker 注册表,Docker swarm 将无法真正工作。基本上所有节点都需要从同一个地方获取它们的图像,而注册表是共享该信息的机制。还有其他方法可以在 swarm 中的每个节点上加载图像,但它需要在每个节点上一次执行相同的命令来加载图像,这不是很好。

    或者,您可以将 docker configs 用于您的配置数据,而不是每次都重新构建映像。这在没有注册表的情况下可以很好地工作,并且您可以在几乎没有停机的情况下更换配置数据:

    Rotate Configs

    【讨论】:

    • 谢谢@CantankerousBullMoose。早些时候我尝试使用私有注册表导致相同的错误,但今天晚些时候,在您的输入集中在相同的方法之后。我的假设是因为本地机器已经登录到私有注册表,我认为它会无缝工作,但是今天滚动部署在通过选项--with-registry-auth 后开始工作后续问题,docker stack deploy 命令是否总是从注册表中提取最新的图像?因为我没有找到像pull=always 这样的选项
    • @Revanth Docker 节点将其当前映像副本的哈希值与注册表中的哈希值进行比较,并在注册表具有不同版本时随时拉取。
    猜你喜欢
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多