跳到主要内容

Watchtower

Watchtower 是一个自动化的容器更新工具,它可以监视运行中的 Docker 容器,当检测到容器镜像的更新版本时,会自动拉取新镜像并使用相同的启动参数重新启动容器。

官方网站

Docker方式安装

compose文件

创建 compose.yml 文件:

version: "3"
services:
watchtower:
container_name: watchtower
image: containrrr/watchtower:latest
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ${DOCKER_DIR}/watchtower/config.json:/config.json
environment:
- TZ=Asia/Shanghai
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_POLL_INTERVAL=86400
- WATCHTOWER_INCLUDE_STOPPED=false
- WATCHTOWER_NOTIFICATION_REPORT=true
env_file:
- .env

env文件

创建 .env 文件,用于配置通知和其他参数:

# 通知配置
WATCHTOWER_NOTIFICATIONS=shoutrrr
WATCHTOWER_NOTIFICATION_URL=telegram://API_TOKEN@telegram/?channels=CHAT_ID

# 私有仓库配置(如果需要)
# WATCHTOWER_USER=username
# WATCHTOWER_PASSWORD=password

启动

docker compose up -d

配置文件

如果需要访问私有仓库,创建 config.json 文件:

{
"auths": {
"registry.example.com": {
"auth": "base64编码的username:password"
}
}
}

生成 base64 编码的凭证:

echo -n 'username:password' | base64

常用参数说明

  • WATCHTOWER_CLEANUP: 更新后删除旧镜像(默认: false)
  • WATCHTOWER_POLL_INTERVAL: 检查更新的间隔时间(秒)(默认: 86400, 即24小时)
  • WATCHTOWER_INCLUDE_STOPPED: 是否包含已停止的容器(默认: false)
  • WATCHTOWER_NOTIFICATION_REPORT: 发送详细报告(默认: false)
  • WATCHTOWER_TIMEOUT: 等待容器停止的超时时间(秒)(默认: 10)
  • WATCHTOWER_LABEL_ENABLE: 只更新设置了 com.centurylinklabs.watchtower.enable=true 标签的容器

使用示例

  1. 只更新特定容器:
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower container1 container2
  1. 立即检查更新(一次性运行):
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-once
  1. 排除特定容器(在 compose.yml 中添加标签):
services:
myservice:
labels:
- "com.centurylinklabs.watchtower.enable=false"

备注

  1. Watchtower 默认会更新所有容器,包括自身。如果不想更新自身,可以添加环境变量 WATCHTOWER_NO_RESTART=true

  2. 通过 Cron 表达式设置更新时间:

WATCHTOWER_SCHEDULE=0 0 4 * * *  # 每天凌晨4点更新
  1. 当容器使用默认的 latest 标签时,Watchtower 通过比较镜像的摘要来确定是否有更新,而不仅仅是标签名。

  2. 为保障系统安全,建议给 Watchtower 容器设置适当的资源限制.