当前位置: 首页 > news >正文

如何使用 Watchtower 实现定时更新 docker 中的镜像并自动更新容器(附 schedule 的参数详细解释)

文章目录

  • 一、问题背景
  • 二、Watchtower 介绍
  • 三、标准用法
  • 四、定时运行

一、问题背景

当我们使用 Docker 中运行了 容器 之后,如果我们想要更新容器所运行的 镜像,我们首先会停止掉当前的 容器,然后更新相关的 镜像 ,最后再重新运行 容器。如果有多个这样的 容器 需要更新时,这样的工作会略显繁琐,因此我们希望有一个自动化更新的工具帮助我们完成这些过程。

而 containrrr/watchtower 即是为此目的而设计的 Docker 镜像,本文将利用 Watchtower 实现定时更新 docker 中的镜像并自动更新容,同时附上 schedule 的参数的详细解释。

在这里插入图片描述

二、Watchtower 介绍

  • containrrr/watchtower Github地址:https://github.com/containrrr/watchtower
  • Watchtower 官方文档:https://containrrr.dev/watchtower/arguments/

Watchtower 将自动的拉取新镜像,然后优雅的停止已经存在的 容器,并使用与部署时相同的参数重启此 容器。具体的用法可以参考 Watchtower 官方文档

Watchtower will pull down your new image, gracefully shut down your existing container and restart it with the same options that were used when it was deployed initially.

三、标准用法

docker 中运行 Watchtower 可以使用如下命令:

docker run -d \--name watchtower \--volume /var/run/docker.sock:/var/run/docker.sock \containrrr/watchtower

此时即可在容器中创建新的容器并启动 Watchtower,由于默认是延迟一天之后才触发,此时查看 Docker 容器的日志,可以看到会有以下类似的打印,表示下次运行的时间:

stderr: time="2025-08-10T11:25:44+08:00" level=info msg="Scheduling first run: 2025-08-12 02:00:00 +0800 CST"
stderr: time="2025-08-10T11:25:44+08:00" level=info msg="Note that the first check will be performed in 23 hours, 59 minutes, 59 seconds"

将此方法修改为 docker-compose 样式为:

services:watchtower:image: containrrr/watchtowercontainer_name: watchtowerhostname: watchtowerrestart: unless-stoppedvolumes:- /var/run/docker.sock:/var/run/docker.sock

四、定时运行

Watchtower 支持使用 --schedule-s 参数实现定时运行,相关用法如下:
https://containrrr.dev/watchtower/arguments/#scheduling

在这里插入图片描述

其参数后面所接字符串的语法规则为 go 语法的 cron 表达式,用于定义匹配时间点的规则,相关用法如下:https://pkg.go.dev/github.com/robfig/cron@v1.2.0#hdr-CRON_Expression_Format

在这里插入图片描述

其参数格式如下:Seconds Minutes Hours Day of month Month Day of week,即 秒 分 时 天 月 星期, 每个值直接使用空格分隔,同时每个值的取值范围如下:

  • :0 - 59
  • :0 - 59
  • :0 - 23
  • :1 - 31
  • :1 - 12
  • 星期:0 - 6 (周日为0)

同时支持使用特殊字符

  • * :此符号表示匹配所有该值的时间点,例如 在秒使用 * 则表示每秒执行。
  • /:此符号表示该值的每增量的时间点,此语法规则为 初值-尾值/增量,例如 在秒使用 3-59/5 表示从3秒开始,每5秒执行一次,一直到59秒
  • ,:表示多个值可选,例如在秒使用 1,2,3,每逢1秒,2秒,3秒时执行一次
  • -:表示一个范围的时间点,[start, end),不包括尾值,例如在秒使用 10-20,则每逢10-20秒则执行一次

利用以上规则,即可以编写相关的语法。举例如下:

  • 每年一月一号执行:0 0 0 1 1 *
  • 每月一号执行一次:0 0 0 1 * *
  • 每周日执行一次: 0 0 0 * * 0
  • 每天执行一次:0 0 0 * * *
  • 每小时执行一次:0 0 * * * *

例如,我想实现每周二两点执行一次更新,即 --schedule "* * 2 * * 2",同时需要指定时区为中国的时区,那么 docker 命令如下:

docker run -d \--name watchtower \--hostname watchtower \-v /var/run/docker.sock:/var/run/docker.sock \-e TZ=Asia/Shanghai \-e CRON_TZ=Asia/Shanghai \containrrr/watchtower \--schedule "* * 2 * * 2"

转化为 docker-compose 样式为:

services:watchtower:image: containrrr/watchtowercontainer_name: watchtowerhostname: watchtowerrestart: unless-stoppedvolumes:- /var/run/docker.sock:/var/run/docker.sockenvironment:# 强制使用北京时间- TZ=Asia/Shanghai- CRON_TZ=Asia/Shanghaicommand: # 每周二北京时间4点执行--schedule "* * 2 * * 2"
http://www.lryc.cn/news/617399.html

相关文章:

  • 京东商品评论API秘籍!轻松获取商品评论数据
  • Go 语言三大核心数据结构深度解析:数组、切片(Slice)与映射(Map)
  • 【JSON】通俗易懂的JSON介绍
  • LangChain 框架 Parser 讲解
  • Spring Framework源码解析——InitializingBean
  • 基于数据结构用java实现二叉树的排序器
  • 零基础AI编程开发微信小程序赚流量主广告实战
  • Spring Framework源码解析——DisposableBean
  • 【PyTorch】单目标检测项目部署
  • 逃离城市与喧嚣,拥抱新的生活方式
  • 第2节 PyTorch加载数据
  • 5G与云计算对代理IP行业的深远影响
  • AI基础与实践专题:PyTorch实现线性回归
  • 开博尔雷电5数据线:120Gbps“闪电传输”,以Intel硬核基因从容优化数字生活
  • STM32CubeMX + HAL 库:用硬件IIC接口实现AT24C02 EEPROM芯片的读写操作
  • 【算法训练营Day23】贪心算法part1
  • InfluxDB 在物联网设备数据采集与分析中的应用(二)
  • Apache Ignite超时管理核心组件解析
  • 元数据管理与数据治理平台:Apache Atlas 基本搜索 Basic Search
  • 强化学习常用数据集
  • linux 秒 安装谷歌浏览器 区分ubuntu和centos 给python爬取网站使用
  • 提升行车安全的关键技术:BSD(盲点监测)与DSM(驾驶员监测)是如何工作的?
  • 剧本杀小程序系统开发:推动行业数字化转型新动力
  • 【VS Code - Qt】如何基于Docker Linux配置Windows10下的VS Code,开发调试ARM 版的Qt应用程序?
  • AI模型服务接入WAF防火墙
  • 为什么Open WebUI可以不联网问问题,而直接使用Ollama可能需要联网
  • 虚幻GAS底层原理解剖十 (网络)
  • Linux操作系统从入门到实战(二十)进程优先级
  • 汉森(1982)提出的广义矩估计法
  • ResponseBodyAdvice是什么?