GitHub
原文
Docker
docker run -d \
--name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower
自动清除旧镜像
- 官方给出的默认启动命令在长期使用后会堆积非常多的标签为
none
的旧镜像,如果放任不管会占用大量的磁盘空间。要避免这种情况可以加入 --cleanup
选项,这样每次更新都会把旧的镜像清理掉。
--cleanup
选项可以简写为 -c
:
docker run -d \
--name watchtower \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower -c
选择性自动更新
容器更新列表
- 假设我们只想更新
nginx
、redis
这两个容器,我们可以把容器名称追加到启动命令的最后面,就像下面这个例子:
docker run -d \
--name watchtower \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower -c \
nginx redis
- 博主觉得把需要更新的容器名称写在启动命令中不利于管理,于是想了个更好的方法,建立一个更新列表文件。
cat ~/.watchtower.list
aria2-pro
unlockmusic
mtg
...
docker run -d \
--name watchtower \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower -c \
$(cat ~/.watchtower.list)
- 这样只需要调整列表后删除 Watchtower 容器并重新执行上面的命令重新启动 Watchtower 即可。
设置单个容器自动更新特征
- 给容器中添加
com.centurylinklabs.watchtower.enable
这个 LABEL 并设置它的值为 false
,或者在启动命令中加入 --label com.centurylinklabs.watchtower.enable=false
参数可以排除相应的容器。下面这个例子是博主的 openwrt-mini
镜像的容器启动命令,Watchtower 将永远忽略它的更新,即使它包含在自动更新列表中。
docker run -d \
--name openwrt-mini \
--restart always \
--network openwrt \
--privileged \
--label com.centurylinklabs.watchtower.enable=false \
p3terx/openwrt-mini \
/sbin/init
- 当容器启动命令中加入
--label com.centurylinklabs.watchtower.enable=true
参数,并且给 Watchtower 加上 --label-enable
选项时,Watchtower 将只更新这些包含此参数的容器。
--label-enable
可以简写为 -e
:
docker run -d \
--name watchtower \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower -ce
- 因为需要在容器启动时进行设置,且设置后就无法直接更改,只能重建容器,所以这种方式的灵活性不如更新列表法。尤其是在设置
com.centurylinklabs.watchtower.enable=false
参数后容器将永远被 Watchtower 忽略,也包括后面将要提到的手动更新方式,所以一般不推荐这样做,除非你愿意手动重建的原生方式更新。
设置自动更新检查频率
--interval
, -i
- 设置更新检测时间间隔,单位为秒。比如每隔 1 个小时检查一次更新
docker run -d \
--name watchtower \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower -c \
--interval 3600
--schedule
, -s
- 设置定时检测更新时间。格式为 6 字段 Cron 表达式,而非传统的 5 字段,即第一位是秒。比如每天凌晨 2 点检查一次更新:
docker run -d \
--name watchtower \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower -c \
--schedule "0 0 2 * * *"
手动更新
- 前面的使用方式都是让 Watchtower 以
detached
(后台)模式在运行并自动更新容器,而 Watchtower 也支持以 foreground
(前台)模式来使用,即运行一次退出并删掉容器,来实现手动更新容器。这对于偶尔更新一次那些不在自动更新列表中的容器非常有用。
- 对于
foreground
模式,需要加上 --run-once
这个专用的选项。下面的例子 Docker 会运行一次 Watchtower 并检查 aria2-pro
容器的基础镜像更新,最后删掉本次运行创建的 Watchtower 容器。
--run-once
可以简写为 -R
:
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower -cR \
aria2-pro
- 需要注意的是当这个容器设置过
com.centurylinklabs.watchtower.enable=false
参数时不会更新。