对于一些个人的小项目来说,没必要也没能力上一些大型 devops 工具(如 jenkins,argocd) 时, 有一些小工具往往非常好用

当我们 ci 打包完成 docker 镜像之后需要 cd (部署)时,如果没有工具,有时候特别麻烦,而一些大型的重工具往往对于小项目来说并不合适。今天要说的一个小工具就是 watchtower。

地址: https://github.com/containrrr/watchtower/

介绍

功能

watchtower-usage-flow.png

  • 定时对比当前机器上的启动着的容器,如果发现新版本的镜像则停止、拉取、重启以更新容器
  • 支持 cron 指定对比时间
  • 支持指定容器
  • 支持更新后进行通知

适用场景

  • 单机小项目
  • 启停间隔无所谓
  • docker 镜像 latest 一把梭

使用

使用部署非常简单,一个 docker-compose 就能说清楚所有基础能力

1
2
3
4
5
6
7
8
9
10
11
12
13
version: "3"
services:
watchtower:
image: containrrr/watchtower
environment:
- TZ=Asia/Shanghai
- WATCHTOWER_NOTIFICATIONS=slack
- WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL="https://hooks.slack.com/services/xx/xx"
- WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=linkinstars-watcher
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /root/.docker/config.json:/config.json
command: your-app1 your-app2 --cleanup --interval 60
  • your-app1 your-app2 你需要监控的 docker 容器名称,如果不写,则是全部
  • --cleanup 自动清理旧镜像,建议打开
  • --interval 监控间隔时间,单位:秒。也可以替换为 cron 表达式 --schedule "0 0 4 * * *" 当然注意配置时区,否则时间不对。
  • WATCHTOWER_NOTIFICATIONS 通知渠道,具体其他通知配置可以参考:https://containrrr.dev/watchtower/notifications/
  • /var/run/docker.sock:/var/run/docker.sock 必须有,docker 容器的操作权限
  • /root/.docker/config.json:/config.json 如果需要拉取私有 docker 仓库,则需要配置这个,否则拉取不到

其他

启动之后,如果需要单次执行,可以使用下面的命令:

1
docker exec -it watchtower-watchtower-1 /watchtower --debug --run-once your-app1
  • watchtower-watchtower-1 为你启动的 watchtower 容器名称
  • your-app1 是你需要检查的容器名称

总结

我最喜欢它的一点是解耦了 cd 和 ci,不需要一个独立的平台去配置 ssh 访问服务器去执行 cd 的工作,所以我用了也挺久的了,对于自己家里的小项目来说是足够了的。不过就一点很难受,通知不支持任意的 webhook,仅仅支持 slack 的 webhook,也没别的办法,无法接入钉钉飞书。