Docker Swarm 如何自动更新镜像

72次阅读
没有评论

问题描述

在使用 Docker Swarm 进行容器编排时,遇到了一个问题。大约每两个月,Docker Swarm 会删除并尝试更新所有来自主分支(仅限主分支)的镜像。然而,Docker 守护进程无法从 GitLab 仓库中拉取镜像,导致容器启动失败。用户在日志中看到了以下错误信息:

dockerd[1302]: time="2023-05-22T10:48:20.216948993+02:00" level=error msg="pulling image failed" error="Get [URL]/master/manifests/[…]: unauthorized: HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access token instead of a password. module=node/agent/taskmanager node.id=[ID] service.id=[ID] task.id=[ID]

用户使用个人访问令牌(personal access token)来拉取镜像,该令牌在 /root/.docker/config.json 文件中配置,并且没有启用双因素认证(2FA)。用户手动拉取镜像时没有遇到任何授权问题。用户注意到 Docker 似乎会尝试使用他的 GitLab 账户登录,尽管有其他人也在使用这台机器和 Docker Swarm。手动拉取镜像并重新部署堆栈可以暂时解决问题,但用户希望了解是什么原因导致这个问题,并且能够在将来避免类似的情况。

用户提出了以下几个问题:
1. 为什么 Docker 会删除并拉取只有主分支的镜像,或者只有主分支的拉取失败了?
2. 这个配置在哪里进行?
3. config.json 文件是正确的身份验证配置位置吗?还是应该属于我的用户?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

Docker Swarm 默认情况下不会自动更新镜像,因此可能存在其他原因导致镜像被删除和拉取。以下是一些可能的原因和解决方案:
1. 镜像标签问题:检查镜像的标签是否正确,并确保在 Docker Swarm 中使用的标签与 GitLab 上的标签匹配。
2. 认证问题:确保个人访问令牌(personal access token)在 /root/.docker/config.json 文件中正确配置,并且没有启用双因素认证(2FA)。
3. 网络问题:检查网络连接是否正常,确保 Docker Swarm 能够访问 GitLab 仓库。
4. Docker 版本问题:确保 Docker 版本与 Docker Swarm 兼容,并且没有已知的问题或错误。

方案2

如果问题仍然存在,可以尝试手动更新镜像并重新部署堆栈。以下是一些操作步骤:
1. 手动拉取镜像:使用以下命令手动拉取镜像,并确保没有任何授权问题:
docker pull [镜像名称]
2. 更新堆栈:使用以下命令更新堆栈,并重新部署:
docker stack deploy -c [堆栈文件] [堆栈名称]
请将 [堆栈文件] 替换为你的堆栈配置文件的路径,将 [堆栈名称] 替换为你的堆栈名称。

方案3

如果以上解决方案都无法解决问题,可以尝试重新配置 Docker Swarm 和 GitLab 的集成。以下是一些可能的操作步骤:
1. 检查 Docker Swarm 配置:确保 Docker Swarm 的配置正确,并且与 GitLab 的集成没有任何问题。
2. 检查 GitLab 配置:确保 GitLab 的配置正确,并且与 Docker Swarm 的集成没有任何问题。
3. 重新配置集成:如果有必要,可以尝试重新配置 Docker Swarm 和 GitLab 的集成,以确保它们之间的通信正常。

请根据具体情况选择适合的解决方案,并根据需要进行相应的操作。如果问题仍然存在,请参考 Docker Swarm 和 GitLab 的官方文档,或者向社区寻求帮助。

正文完