Watchtower:历史用法与停维后的迁移注意
Watchtower 监控运行中容器的镜像仓库,新版本推送后自动拉取并以相同配置重建容器。原项目已归档停维。本文解释历史用法、权限风险与存量迁移,不建议新增生产部署。
直接回答:Watchtower 是容器更新自动化工具——周期性检查运行中容器的镜像有没有新版本,有则拉取并按原配置(端口/卷/环境变量)重建容器。支持白名单监控特定容器、monitor-only 仅通知模式(邮件/Slack 提醒人工介入),自更新自身也在覆盖范围。
维护状态:官方仓库于 2025-12-17 归档,并明确说明项目不再维护;官方也不推荐商业或生产使用。以下仅解释存量配置,不是安装推荐。优先迁移到有维护责任、审批、健康验证和回滚机制的发布流程。
工作方式
Watchtower 盯着运行容器所用镜像的仓库标签:新 digest 出现 → 拉取 → 优雅停旧容器 → 同配置起新容器 → 若启用 cleanup 再清理旧镜像。
部署
docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower:1.7.1 --monitor-only --run-once web
Compose 版本:
services:
watchtower:
image: containrrr/watchtower:1.7.1
volumes: ["/var/run/docker.sock:/var/run/docker.sock"]
environment:
WATCHTOWER_POLL_INTERVAL: 3600 # 每小时检查
WATCHTOWER_MONITOR_ONLY: "true" # 存量配置仅检查,不重建
WATCHTOWER_CLEANUP: "false" # 不自动删除回退镜像
精细化控制
# 只管指定容器
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower:1.7.1 --monitor-only --run-once web
# 仅监控不更新(通知模式)
WATCHTOWER_MONITOR_ONLY=true
WATCHTOWER_NOTIFICATIONS=slack # 或 shoutrrr 系 webhook
容器侧用 label com.centurylinklabs.watchtower.enable=false 把关键服务排除在自动更新外。
示例固定历史版本,不代表该版本仍安全或与当前 Engine API 兼容。socket 授权近似宿主 root;只读挂载也不限制 API 操作。monitor-only 不重建容器,但仍可能拉取镜像;通知须另配有效通知渠道和凭证。
存量迁移注意
- 有状态服务别开自动更新(数据库!)——monitor-only 人工窗口升级
- 配 healthcheck:新容器健康检查失败时人工介入的依据
- 更新窗口与频率节制:凌晨低峰、每小时级轮询够用
- 卷保留不等于升级无损;数据库格式迁移可能不可逆,须有一致性备份和恢复演练
迁移或更新镜像后,保留旧版本号和变更时间,再检查健康请求及应用错误。已有观测云日志采集时,可将版本写入结构化日志并通过 DataKit采集,按变更前后相同窗口核对失败记录;是否回退仍需结合业务验证和数据兼容性判断。
常见问题(FAQ)
Q:更新失败会回滚吗?
A:Watchtower 无自动回滚——新容器起不来就停在那。关键服务用 monitor-only 或配合健康检查+人工流程。
Q:和 CI/CD 推送部署冲突吗?
A:Watchtower 适合"跟踪上游镜像"(如 nginx、第三方服务);自家应用的发布走 CI/CD 显式部署,别混用。
Q:私有仓库支持吗?
A:支持——挂载 Docker config(含认证)进 Watchtower 容器即可拉私有镜像。
官方参考
本文依据官方文档整理,示例未在本文中进行运行验证。生产部署需按所用版本、权限和实际负载验证。