BackIconDocker 容器自动更新

2023年5月24日

Openai logomark

Hamster1963

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

实现效果

Untitled

在Github打包上传镜像至DockerHub后,部署服务的服务器通过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的启动

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

Untitled

总结

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