###自动管理docker容器更新的工具Watchtower
Watchtower是一个用于自动管理docker容器更新的工具,它通过监控docker Hub上的镜像更新,自动更新容器中的镜像,保持容器 Always Running。
Watchtower的安装非常简单,只需在docker容器中运行以下命令即可:

1
2
3
4
$ docker run -d \
--name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower

docker-compose.yml配置示例:

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

指定容器更新

Watchtower默认会自动更新所有容器,如果你想指定容器更新,可以在容器启动时添加--watchtower参数,例如:

1
2
3
4
5
6
7
8
9
10
version: '3.8'

services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: lobe-chat nginx

按更新列表指定(维护灵活)

Watchtower也可以通过配置文件来指定需要更新的容器,配置文件默认在/config/watchtower.yaml,可以通过--override-config参数来指定配置文件路径。

1
2
3
4
5
6
7
8
9
10
version: '3.8'

services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: $(cat ~/.docker_update.list)

注:也可使用容器更新标签进行容器标注的方法,此法麻烦且不灵活,知道就可以
–label com.centurylinklabs.watchtower.enable=true

清除旧容器参数

Watchtower默认不会清理旧容器,如果需要清理旧容器,可以在启动时添加--cleanup参数,例如:

1
2
3
4
5
6
7
8
9
10
version: '3.8'

services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: -c $(cat ~/.docker_update.list)

更新频率

配置文件示例:

1
2
3
4
5
6
7
8
9
10
version: '3.8'

services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: -c $(cat ~/.docker_update.list) --interval 3600
1
2
3
4
5
6
7
8
9
10
version: '3.8'

services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: -c $(cat ~/.docker_update.list) --schedule "0 40 3 * * *"

6字段的表达式,不是传统的5字段,顺序是:秒分时日月周

自动配置docker_update.list文件

脚本虽然自动了!但是列表还是需要自动化一下,有时候部署一个新的docer之后会忘记把docker加入到这个列表里。(生产环境多注意)
创建脚本文件(比如 generate_docker_update_list.sh):

1
2
3
4
#!/bin/bash

# 获取当前所有运行中的容器的镜像名
docker ps --format '{{.Image}}' > ~/.docker_update.list

授权和运行脚本:

1
2
chmod +x ~/generate_docker_update_list.sh
~/generate_docker_update_list.sh

定期更新脚本:

1
2
crontab -e
*/0 1 * * * ~/generate_docker_update_list.sh # 每天1点执行一次