当前位置: 首页 > news >正文

如何检查 Watchtower 是否正常工作及更新未生效的排查方法【日常排错】

文章目录

  • 前言
  • 一、验证 Watchtower 是否正在运行
    • 1. 检查 Watchtower 容器状态
    • 2. 查看 Watchtower 日志
  • 二、检查5分钟间隔设置是否正确
    • 1. 确认启动命令
    • 2. 验证环境变量
  • 三、排查更新未生效的原因
    • 1. 检查是否有镜像更新
    • 2. 检查容器标签
    • 3. 检查监控范围
  • 四、测试 Watchtower 功能
    • 1. 手动触发检查🎯
    • 2. 创建测试容器
  • 五、常见问题解决方案
    • 1. 时间间隔不生效
    • 2. Watchtower 完全不工作
  • 六、推荐的生产环境监控方案
  • 七、分析日志
    • 1. 阿里云私有仓库认证失败(主要问题)
    • 2. 解决方案
    • 3. 问题解决


前言

写这篇文章主要记录一次实际生产环境遇到的问题。起因是公司有两个镜像库,一个是无需认证的公共镜像库,一个是需要账号密码认证的私有镜像库。都通过docker + watchtower 实现自动容器更新,但是私有库死活不生效。下面记录了排查过程。我这里是用了 5分钟 的定时检查。

虽然下文有很多方法都不是解决本次事故的原因,但是如果你不是站在 上帝视角你又怎么能知道到底是因为什么原因引起的呢?所以我把排查方法都罗列出来了。


一、验证 Watchtower 是否正在运行

1. 检查 Watchtower 容器状态

docker ps -f name=watchtower

正常应该看到类似输出:

CONTAINER ID   IMAGE                       COMMAND        CREATED       STATUS       PORTS     NAMES
a1b2c3d4e5f6   containrrr/watchtower:latest   "/watchtower"   2 days ago    Up 2 days             watchtower

如果 STATUS 不是 "Up" ,说明容器没有正常运行。

2. 查看 Watchtower 日志

docker logs watchtower

正常运行的 Watchtower 会有类似这样的周期性日志:

time="2023-05-01T12:00:00Z" level=info msg="Checking for new images"
time="2023-05-01T12:00:01Z" level=info msg="No new images found for nginx"

二、检查5分钟间隔设置是否正确

1. 确认启动命令

你的启动命令应该包含类似这样的环境变量设置:

docker run -d \--name watchtower \-v /var/run/docker.sock:/var/run/docker.sock \-e WATCHTOWER_POLL_INTERVAL=300 \  # 300秒=5分钟containrrr/watchtower

常见错误:

  • 拼写错误:WATCHTOWER(错误) vs WATCHTOWER(正确)
  • 值不是秒数:应该直接写300(秒),而不是"5m"或"5 minutes"

2. 验证环境变量

docker inspect watchtower | grep -i poll_interval

应该能看到类似:

"WATCHTOWER_POLL_INTERVAL=300"

三、排查更新未生效的原因

1. 检查是否有镜像更新

Watchtower 只会在镜像仓库有新版本时才会更新。确认你的镜像确实有新版本:

docker pull 你的镜像名:latest
docker images | grep 你的镜像名

2. 检查容器标签

某些标签会阻止 Watchtower 更新:

docker inspect 你的容器名 | grep -i watchtower.enable

如果看到 "com.centurylinklabs.watchtower.enable=false",说明该容器被排除在更新外。

3. 检查监控范围

默认 Watchtower 监控所有容器,但如果你指定了特定容器,确认包含了你想要更新的容器:

docker inspect watchtower | grep -A5 "Cmd"

四、测试 Watchtower 功能

1. 手动触发检查🎯

docker exec watchtower /watchtower --run-once

这会立即执行一次检查更新操作,查看日志确认:

docker logs watchtower --tail 50

2. 创建测试容器

启动一个专门用于测试的容器:

docker run -d --name test-watchtower alpine tail -f /dev/null

然后推送一个新版本的 alpine 镜像到仓库,观察 Watchtower 是否会更新这个测试容器。

五、常见问题解决方案

1. 时间间隔不生效

可能原因:

  • 环境变量名称拼写错误
  • 值格式不正确(必须是秒数)
  • Watchtower版本过旧

解决方案:

# 停止并删除旧容器
docker stop watchtower && docker rm watchtower# 使用最新版Watchtower并正确设置
docker run -d \--name watchtower \-v /var/run/docker.sock:/var/run/docker.sock \-e WATCHTOWER_POLL_INTERVAL=300 \containrrr/watchtower:latest

2. Watchtower 完全不工作

检查点:

  • 确保 Docker 守护进程正常运行
  • 检查 /var/run/docker.sock 的权限
  • 尝试使用 --debug 模式获取更多日志信息:
docker run -d \--name watchtower \-v /var/run/docker.sock:/var/run/docker.sock \-e WATCHTOWER_POLL_INTERVAL=300 \-e WATCHTOWER_DEBUG=true \containrrr/watchtower

然后查看详细日志:📃

docker logs watchtower

六、推荐的生产环境监控方案

对于生产环境,建议配置通知功能以便及时了解更新情况:

docker run -d \--name watchtower \-v /var/run/docker.sock:/var/run/docker.sock \-e WATCHTOWER_POLL_INTERVAL=300 \-e WATCHTOWER_NOTIFICATIONS=email \-e WATCHTOWER_NOTIFICATION_EMAIL_FROM=your@email.com \-e WATCHTOWER_NOTIFICATION_EMAIL_TO=admin@email.com \-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.email.com \-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587 \-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=your@email.com \-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=yourpassword \containrrr/watchtower

通过以上步骤,你应该能够确定为什么5分钟更新间隔没有生效,并根据具体情况解决问题。如果问题仍然存在,可以提供更多日志信息以便进一步诊断。

七、分析日志

上面方法我都试了,然而还是不行,我就把日志拷贝出来分析了下,后来恍然大悟,有没有可能是我们拉取镜像时没有登录授权,因为这个镜像库是私有的。一拍脑袋,没错。日志如下:

time="2025-05-07T07:36:21Z" level=debug msg="Got response to challenge request" header="Bearer realm=\"https://dockerauth.cn-hangzhou.aliyuncs.com/auth\",service=\"registry.aliyuncs.com:cn-beijing:26842\"" status="401 Unauthorized"

1. 阿里云私有仓库认证失败(主要问题)

多个容器出现类似错误:

time="2025-05-07T07:36:21Z" level=debug msg="No credentials for registry.cn-beijing.aliyuncs.com found"
time="2025-05-07T07:36:21Z" level=debug msg="Error pulling image registry.cn-beijing.aliyuncs.com/itdos/os.itdos.com:latest, Error response from daemon: pull access denied..."

问题分析:

  • 所有来自 registry.cn-beijing.aliyuncs.com 的镜像都无法拉取
  • Watchtower 没有配置私有仓库的认证信息
  • 错误明确显示 "pull access denied"

根本原因:
私有仓库需要登录凭证,但 Watchtower 未配置这些凭证。

2. 解决方案

方案1:配置 Watchtower 使用私有仓库凭证
方法A:通过环境变量传递凭证

docker run -d \--name watchtower \-v /var/run/docker.sock:/var/run/docker.sock \-e REPO_USER=your_username \-e REPO_PASS=your_password \-e WATCHTOWER_POLL_INTERVAL=300 \containrrr/watchtower \--debug

方法B:使用 Docker 配置文件(推荐)
首先登录私有仓库:

docker login registry.cn-beijing.aliyuncs.com

然后启动 Watchtower 并挂载 Docker 配置文件:

docker run -d \--name watchtower \-v /var/run/docker.sock:/var/run/docker.sock \-v $HOME/.docker/config.json:/config.json \-e WATCHTOWER_POLL_INTERVAL=300 \containrrr/watchtower

3. 问题解决

我用了第一种方法,通过环境变量传递凭证

docker run -d \--name watchtower \-v /var/run/docker.sock:/var/run/docker.sock \-e REPO_USER=your_username \-e REPO_PASS=your_password \-e WATCHTOWER_POLL_INTERVAL=300 \containrrr/watchtower \--debug

果然问题解决✅

相关文章:

  • C语言学习之字符函数和字符串函数
  • 2025年五一假期旅游市场新趋势:理性消费、多元场景与科技赋能
  • C#管道通讯及传输信息丢失的原因
  • 信息革命对经济、货币体系及权力结构的颠覆性影响
  • 深入了解linux系统—— 进程控制
  • 虚拟现实(VR)与增强现实(AR)在教育领域的应用:开启沉浸式学习新时代
  • 006 yum和Linux生态
  • 可执行文件格式(ELF格式)以及进程地址空间第二讲【Linux操作系统】
  • 精益数据分析(46/126):深入剖析用户生成内容(UGC)商业模式
  • 各地级市儒家学校、学堂、孔庙数据
  • sizeof 和 strlen 的区别
  • 链表——C语言
  • Nacos源码—5.Nacos配置中心实现分析一
  • 多功能气体检测报警系统,精准监测,守护安全
  • 数据结构——排序(万字解说)初阶数据结构完
  • Java学习手册:ORM 框架性能优化
  • Unity WebGL、js发布交互
  • Oracle OCP认证考试考点详解083系列11
  • 什么是先验?(CVPR25)Detail-Preserving Latent Diffusion for Stable Shadow Removal论文阅读
  • 面试题 03.06 动物收容所
  • 当创业热土遇上年轻气息,上海南汇新城发展如何再发力?
  • 习近平圆满结束对俄罗斯国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典
  • 4月金融数据前瞻:受去年低基数因素影响,社融增量有望同比大幅多增
  • 中方就乌克兰危机提出新倡议?外交部:中方立场没有变化
  • 重庆党政代表团在沪考察,陈吉宁龚正与袁家军胡衡华共商两地深化合作工作
  • 上海启动万兆光网试点建设,助力“模速空间”跑出发展加速度