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

如何检查 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

果然问题解决✅

http://www.xdnf.cn/news/4436.html

相关文章:

  • 探寻程序开发的个人密码
  • excel 批量导出图片并指定命名
  • Excel点击单元格内容消失
  • 龙虎榜——20250507
  • LVGL -meter的应用
  • phpstudy升级新版apache
  • 如何在金仓数据库KingbaseES中新建一个数据库?新建一个表?给表添加一个字段?
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】8.1 基础图表绘制(折线图/柱状图/散点图)
  • 把本地的文件拷贝到wsl的文件夹下或者 wsl读取本地的文件
  • 使用node.js创建一个简单的服务器
  • WD5040L、 7V 至 37V 的宽输入电压,输出电压范围为 3.3V 至 36V,6A输出、保护功能强,电源管理利器!
  • Redis的缓存穿透、缓存击穿和缓存雪崩
  • ai说什么是注解,并以angular ts为例
  • Go——项目实战
  • 【强化学习】强化学习算法 - 多臂老虎机问题
  • 精益数据分析(47/126):深挖UGC商业模式的关键要点与指标
  • 多模态大语言模型arxiv论文略读(六十二)
  • uniapp自定义底部导航栏h5有效果小程序无效的解决方案
  • 鞅与停时 - 一种特别的概率论问题
  • 讲解什么是快充诱骗协议芯片及它的工作原理和应用场景
  • 构建生命大模型,开拓教育新境界——启智书院举办十二周年庆典暨教育新生态跨界共拓峰会
  • 【存储管理—动态不等长存储资源分配算法】
  • 可执行文件格式(ELF格式)以及进程地址空间第二讲【Linux操作系统】
  • 【django.db.utils.OperationalError: unable to open database file】
  • Redis-黑马点评
  • 固件测试:mac串口工具推荐
  • 第1章 算法设计基础
  • draw.io流程图使用笔记
  • 机器人跑拉松是商业噱头还是技术进步的必然体现
  • 【愚公系列】《Manus极简入门》024-表演艺术教练:“舞台魔法师”