Watchtower:自动更新 Docker 容器镜像

Watchtower作用

Watchtower 是一个轻量级的开源容器管理工具,可以自动更新 Docker 容器镜像。它监视您的 Docker 环境中可用映像版本的更改,并使用最新映像自动拉取和更新容器。

Watchtower时间间隔调整

默认情况下,Watchtower 每 86400 秒(24 小时)检查一次运行容器化应用程序的 Docker 映像是否有更新。不过,根据您的需要,“WATCHTOWER_POLL_INTERVAL”和“WATCHTOWER_SCHEDULE”环境变量可以更改此间隔。

environment:
# 设置检查的时间间隔,2种表示方法,选一种。
WATCHTOWER_POLL_INTERVAL: 21600
# 每天11 点 30分 检查更新的镜像
WATCHTOWER_SCHEDULE: "0 30 11 * * *"

清理旧的 Docker 镜像

默认情况下,Watchtower 在下载新镜像时不会删除旧的 Docker 镜像。随着时间的推移,这可能会导致数百个孤立的进程占用磁盘空间。

为了避免这种情况,您可以将“WATCHTOWER_CLEANUP”环境变量设置为“true”,这将在使用新镜像重新启动容器后删除旧镜像。

“ WATCHTOWER_REMOVE_VOLUMES “更新后删除匿名卷。指定此标志后,watchtower 将在使用新镜像重新启动之前从容器中删除所有匿名卷。命名的卷不会被删除!

“ WATCHTOWER_ROLLING_RESTART “更新前执行健康检查,确保新容器启动成功后再移除旧容器。

docker-compose.yaml

version: "3"
services:
watchtower:
container_name: watchtower
image: containrrr/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --cleanup --remove-volumes
restart: always
environment:
WATCHTOWER_SCHEDULE: "0 0 4 * * *"
WATCHTOWER_CLEANUP: true
WATCHTOWER_REMOVE_VOLUMES: true
WATCHTOWER_ROLLING_RESTART: true

然后,使用以下命令启动容器:

docker-compose up -d

参考代码:

networks:
app_network:
external: true
services:
watchtower:
image: containrrr/watchtower:latest
volumes:
- '/var/run/docker.sock:/var/run/docker.sock'
- /etc/localtime:/etc/localtime:ro
environment:
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_ROLLING_RESTART=true
- WATCHTOWER_SCHEDULE=0 0 * * * ?
# - WATCHTOWER_POLL_INTERVAL=3600
- WATCHTOWER_NO_STARTUP_MESSAGE=true
- WATCHTOWER_TIMEOUT=60s
- WATCHTOWER_NOTIFICATION_EMAIL_DELAY=xx
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=xx
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=xx
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=465
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER=xx
- WATCHTOWER_NOTIFICATION_EMAIL_TO=xx
- WATCHTOWER_NOTIFICATION_EMAIL_FROM=xx
- WATCHTOWER_NOTIFICATIONS=email
- WATCHTOWER_NOTIFICATIONS_LEVEL=info
container_name: watchtower
restart: always
networks:
- app_network

更多参数详见文档

容器标签禁用监视更新

yaml

0102030405060708services:
mysql:
container_name: mysql
image: mysql:8
。。。
# 添加标签内容,禁用此容器的监视更新
labels:
- com.centurylinklabs.watchtower.enable=false

以mysql为例:

  • compose配置中添加labels节点;
  • labels节点下添加- com.centurylinklabs.watchtower.enable=false关闭容器的监视更新;
  • 此时Watchtower轮训检查时将会忽略mysql容器。
  • image-20230203161923294
请我一杯咖啡吧!
浩跃霖希 微信 微信
浩跃霖希 支付宝 支付宝