docker镜像的自动升级

背景

希望自己的一些docker镜像能随时保持最新状态,比如nginx,redis,甚至mysql等.
平常的方法可能需要手动操作

  1. 停掉并删除container
  2. 下载新的image
  3. 使用新的image建立container

latest不会永远为latest

带有非版本号tag的镜像,其版本可以通过 docker inspect xxx 等方法得到.
据说当pull了最新的latest版本后,原先的镜像tag会变成none.

Watchtower

  1. 这是一个自动监控image信息的工具,能够自动执行上面的操作,并提供额外的功能
    1. 监控了 /var/run/docker.sock, 似乎能够记录下其他container是如何启动的,然后用同样的方式启动新的
    2. 黑白名单功能(但不是特别优雅)
    3. 设置检查间隔
    4. 日志和通知
    5. 使用docker配置连接私有仓库
    6. 监控远程docker
    7. hooks
  2. 本身也是一个docker镜像,安装和使用都很方便,甚至还能更新自身

尽管API的设计并不是特别优雅,但瑕不掩瑜.

初步使用

官方给了特别简单的指导,挑选除了以下内容

1
2
3
4
5
6
7
docker run --rm \
--name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--run-once \
--cleanup \
nginx redis

或者对应的 docker-compose 版本

1
2
3
4
5
6
7
8
version: "3"
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --cleanup mysql

常见参数与用途

  • debug
  • cleanup 清除掉标签变为none的镜像们
  • run-once 只执行一次
  • interval 检查间隔(单位秒),默认86400s即24h.

黑白名单

非侵入式

直接以白名单的形式,在命令中指定要升级的 容器名.
考虑到不是特别依赖版本的镜像数量并不多,该方式比较容易接受

侵入式

该中方式下要求修改其他container的启动命令,加入

1
--label=com.centurylinklabs.watchtower.enable="true"

或者 docker-compose 中使用

1
2
labels:
- com.centurylinklabs.watchtower.enable: "true"

这标签名也太长了,是希望给公司提高知名度吗?

但不能要求所有容器启动时都写上了该label.因此对于默认值的解读,可以用一些方式配置

  • 命令中使用 --label-enable 选项
  • 使用 WATCHTOWER_LABEL_ENABLE 环境变量

watchtower 配置的含义解读如下

  • 配置结果为false(默认): 默认更新所有容器,除非声明label为false
  • 配置结果为true: 默认不更新,除非声明label为true

参考

  1. watchtower官方