之前写过一篇《为哪吒监控面板设置每天定时自动更新》,可以为面板设置每天固定时间(比如凌晨 2 点)检查更新。因为面板更新频繁,我们也可以设置为每隔 1 小时或者半小时检查更新,并在更新后删除旧的镜像。

使用 Watchtower 来自动检查并更新 nezha-dashboard 容器并删除旧镜像,需要配置 Watchtower 以监控该容器并设置清理旧镜像的选项。以下是具体步骤:

启动 Watchtower 容器

运行以下命令以启动 Watchtower 容器,监控 nezha-dashboard 并删除旧的镜像:

docker run -d \
  --name watchtower \
  --restart always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower \
  nezha-dashboard \
  --cleanup

参数说明

  • --name watchtower: 设置容器名称为 watchtower
  • --restart always: 保证 Watchtower 在 Docker 服务重启后自动启动。
  • -v /var/run/docker.sock:/var/run/docker.sock: 挂载 Docker 的 socket,使 Watchtower 能够与 Docker 引擎通信。
  • containrrr/watchtower: Watchtower 的镜像名称。
  • nezha-dashboard: 指定需要监控的容器名称。
  • --cleanup: 在更新容器后自动删除旧的未使用镜像。

验证 Watchtower 是否正常工作
查看 Watchtower 的日志,确认其是否能够正常检测到 nezha-dashboard 容器的更新:

docker logs -f watchtower

日志中应显示类似以下内容:

INFO[0000] Watching containers for updates...
INFO[0001] Checking for updates on container "nezha-dashboard"
INFO[0002] Found new image for "nezha-dashboard". Pulling image ghcr.io/nezhahq/nezha:latest
INFO[0003] Stopping and removing container "nezha-dashboard"
INFO[0004] Creating new container for "nezha-dashboard"
INFO[0005] Removing old image for "nezha-dashboard"

要让 Watchtower 每隔半小时检查更新并在有更新时自动更新容器并删除旧镜像,可以通过以下方式实现:

配置命令

运行以下命令启动 Watchtower:

docker run -d \
  --name watchtower \
  --restart always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e TZ=Asia/Hong_Kong \
  containrrr/watchtower \
  nezha-dashboard \
  --cleanup \
  --schedule "0 */30 * * *"

参数说明

  • -e TZ=Asia/Hong_Kong: 这个环境变量设置容器的时区为 HKT(即香港时间)。这样 Watchtower 将使用本地时区来解析 CRON 表达式。
  • --schedule "0 */30 * * *": 在每小时的第 0 分钟和每 30 分钟时执行检查。
  • --cleanup: 在更新后自动删除旧的未使用镜像,避免占用存储空间。
  • nezha-dashboard: 指定只监控名为 nezha-dashboard 的容器。

验证配置

  1. 查看容器是否启动成功

    docker ps

    确认 watchtower 容器在运行。

  2. 查看日志
    观察 Watchtower 的日志,确保定时任务正确运行:

    docker logs -f watchtower

    日志会显示每 30 分钟执行一次更新检查的记录。

日志示例

日志中应出现类似以下内容:

time="2024-12-01T00:08:32+08:00" level=info msg="Watchtower 1.7.1"
time="2024-12-01T00:08:32+08:00" level=info msg="Using no notifications"
time="2024-12-01T00:08:32+08:00" level=info msg="Only checking containers which name matches \"nezha-dashboard\""
time="2024-12-01T00:08:32+08:00" level=info msg="Scheduling first run: 2024-12-01 00:30:00 +0800 HKT"
time="2024-12-01T00:08:32+08:00" level=info msg="Note that the first check will be performed in 21 minutes, 27 seconds"

这样配置后,Watchtower 将在每小时的第 0 分钟和每 30 分钟时检查 nezha-dashboard 容器是否有更新,并在有新版本时自动更新,随后清理旧镜像。


要取消通过 Watchtower 设置的定时更新和自动删除旧镜像的任务,可以按照以下步骤操作:

停止并删除 Watchtower 容器
运行以下命令停止并删除 Watchtower 容器:

docker stop watchtower && docker rm watchtower && docker rmi containrrr/watchtower

此操作会彻底关闭和移除 Watchtower,从而停止所有由它管理的定时更新任务。

验证 Watchtower 是否已停止
运行以下命令,确认 Watchtower 容器已不再运行:

docker ps -a | grep watchtower

如果没有输出,说明 Watchtower 已成功停止和删除。


1Panel 面板更简单方便的 Watchtower 安装和设置方法:

如果你是按照我博客的方法,使用 1Panel 来管理哪吒面板的反向代理,那么 Watchtower 安装和设置更简单,因为 1Panel 应用商店自带 Watchtower 应用,可以直接安装。

  1. 1Panel 左侧菜单——应用商店,打开右上角搜索框,搜索 Watchtower
  2. 点击安装
  3. 环境参数:WATCHTOWER_NO_STARTUP_MESSAGE ;命令参数:nezha-dashboard --interval 1800 --cleanup
  4. 其它保持不变,点击确认

这样,Watchtower 即可自动每隔半小时检查 nezha-dashboard 镜像更新并在更新后删除旧的镜像文件。