发布于 

利用watchtower实现Docker容器的自动更新部署

在前几篇文章中,讨论了利用Github Actions针对Go项目进行构建与打包镜像,而本文章关注于在简单场景下,单体应用的自动检测镜像版本并在获取到新版本时自动更新并清除旧版本的镜像,这对于测试环境或个人开发者来说较为方便,也可以减少手动更新所带来的时间成本。

实现效果

在Github打包上传镜像至DockerHub后,部署服务的服务器通过watchtower进行检测更新并拉取镜像进行替换更新。完成后进行消息推送的通知。

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

Watchtower配置文件

在所需部署的服务器上采用docker-compose启动watchtower服务,指定版本为1.5.3,在不指定的情况下,latest可能并不能拉取到最新版本的镜像。在WATCHTOWER_NOTIFICATION_URL 中,需要指明的是如果不是通过slack,discord等途径进行消息推送,而是通过http webhook的形式进行推送,则需要在URL前加上generic表明采用原生请求进行推送。

version: "3"
services:
watchtower:
image: containrrr/watchtower:1.5.3
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --interval 15 --cleanup nasnetwork_push_go-push-go-1 push_go_docker-push-go-1
environment:
WATCHTOWER_NOTIFICATION_REPORT: "true"
WATCHTOWER_NOTIFICATION_TITLE_TAG: "hamster"
WATCHTOWER_NOTIFICATION_URL: "generic+http://yourip:port/DockerUpdatePushCore"
WATCHTOWER_NOTIFICATION_DELAY: 5
WATCHTOWER_NOTIFICATION_TEMPLATE: |
{{- if .Report -}}
{{- with .Report -}}
{{len .Scanned}} Scanned, {{len .Updated}} Updated, {{len .Failed}} Failed
{{- range .Updated}}
- {{.Name}} ({{.ImageName}}): {{.CurrentImageID.ShortID}} updated to {{.LatestImageID.ShortID}}
{{- end -}}
{{- range .Fresh}}
- {{.Name}} ({{.ImageName}}): {{.State}}
{{- end -}}
{{- range .Skipped}}
- {{.Name}} ({{.ImageName}}): {{.State}}: {{.Error}}
{{- end -}}
{{- range .Failed}}
- {{.Name}} ({{.ImageName}}): {{.State}}: {{.Error}}
{{- end -}}
{{- end -}}
{{- else -}}
{{range .Entries -}}{{.Message}}{{"\n"}}{{- end -}}
{{- end -}}

如不需要推送服务,则无需添加environment部分内容。

version: "3"
services:
watchtower:
image: containrrr/watchtower:1.5.3
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --interval 15 --cleanup nasnetwork_push_go-push-go-1 push_go_docker-push-go-1

volumes指定系统下docker.sock的路径,而在command中进行绑定需要监测的容器与其他命令,在上述command中,

—interval 指定每次检测的间隔秒数,15则为15秒

—cleanup 指定在更新容器后清理旧容器与旧镜像

nasnetwork_push_go-push-go-1push_go_docker-push-go-1 都为容器名,可通过docker ps 进行查看,多个容器之间通过空格进行分割。

部署

首先通过 docker-compose pull 进行镜像的拉取

拉取完成后,通过docker-compose up -d 进行watchtower的启动

完成后即可通过查看日志获取检测结果信息。

总结

通过这几篇文章,可以以较小的维护成本与开发成本构建一套属于自己的CI/CD流程,利用Docker容器轻松进行容器的分发与部署。后续会继续介绍统一消息推送中心以及k8s与k3s的构建与部署。

之前的文章:

https://buycoffee.top/2023/05/01/使用GitHub Actions为Go项目实现简易CI:CD/

https://buycoffee.top/2023/05/23/利用Github Actions为Go程序添加git与编译信息/


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

@Hamster