利用 Watchtower 定时检查哪吒面板新版本并自动更新

由于哪吒面板 V1 最近更新频繁,我们可以设置为每隔 1 小时或者半小时检查更新,并在更新后删除旧的镜像。

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

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 的容器。

验证配置

查看容器是否启动成功

docker ps

确认 watchtower 容器在运行。

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

docker logs -f watchtower
  1. 日志会显示每 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

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

验证 Watchtower 是否已停止

运行以下命令,确认 Watchtower 容器已不再运行:

docker ps -a | grep watchtower

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

删除 Watchtower 镜像(可选)

如果不再需要 Watchtower,可以删除其镜像以释放存储空间:

docker rmi containrrr/watchtower

通过这些步骤,Watchtower 的自动更新功能会被完全取消,并恢复到手动管理模式。