Docker自动更新镜像方法(Watchtower或定时任务)
本文最后更新于 14 天前,其中的信息可能已经过时,如有 错误/失效 请发送邮件到qimeng9420@foxmail.com或留言。

说明

平时运行 docker 如果需要更新,则需要先停止原来的容器,更新新的镜像,然后再创建新容器,这样操作虽然不繁琐,但是如果容器过多,还是会很麻烦,本文记录一下如何简化自动更新。

步骤

推荐使用 Watchtower,这个是一个工具,可以自动监控运行的容器,在有新镜像时自动更新;另一种办法是使用脚本或者其他运维面板上的定时服务,在固定间隔时间自动拉取容器镜像,若有更新,则执行更新。

Watchtower配置

参考:Watchtower GitHub 地址

首先,先运行 Watchtower,docker 命令:

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

或 docker-compose.yml

version: '3' #新版本docker-compose中version标签已不需要
services:
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower #自定义容器名称
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: --interval 3600 --cleanup --remove-volumes #指定启动Watchtower时的命令和参数。--interval 3600表示每3600秒(即每小时)检查一次更新。--cleanup和WATCHTOWER_CLEANUP=true表示在更新后清理旧的镜像。--remove-volumes和WATCHTOWER_REMOVE_VOLUMES=true表示删除与旧容器关联的匿名卷。
    environment: #设置环境变量,用于控制Watchtower的行为
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_REMOVE_VOLUMES=true
      - WATCHTOWER_NOTIFICATION_TITLE_TAG=Automatic Container Updates #邮件标题前缀添加自定义内容
      - WATCHTOWER_NOTIFICATIONS=email  #设置更新提醒方式为email
      - WATCHTOWER_NOTIFICATION_EMAIL_FROM=frommail@gmail.com #发件人邮箱地址
      - WATCHTOWER_NOTIFICATION_EMAIL_TO=tomail@outlook.com #收件人邮箱地址
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.gmail.com #指定SMTP服务器地址
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587 #指定SMTP服务器端口
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=frommail@gmail.com #邮箱用户名
      - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=your_app_password #设置邮箱应用密码
      - WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2 #设置邮件发送延迟,可以设置延迟时间(单位为秒)
    restart: always

邮箱设置可自行删减,其官方支持提醒方式还是很多,大概如下。我在用Outlook邮箱设置时出过错,喜欢研究的自行踩坑。邮箱设置成功后重新拉去上载镜像会受到Watchtower的测试邮件。

Watchtower支持的多种通知方式对比

在Watchtower支持的多种通知方式中,选择最简单的方式取决于您已经拥有的服务和您的技术偏好。以下是几种方式的简单比较:

  1. Gotify通知
    • 优点:开源、自托管,不需要依赖外部服务。
    • 缺点:需要自己搭建和维护Gotify服务器。
    • 配置难度:中等,需要搭建Gotify服务器,但配置过程相对简单。
  2. Slack通知
    • 优点:集成简单,适合团队协作。
    • 缺点:需要有Slack账户,且对于非团队用户可能不太适用。
    • 配置难度:简单,只需获取Webhook URL并配置。
  3. Microsoft Teams通知
    • 优点:适合企业用户,集成微软生态。
    • 缺点:需要有Microsoft Teams账户。
    • 配置难度:简单,需要获取Webhook URL并配置。
  4. 邮件通知
    • 优点:通用性强,适合个人和小团队。
    • 缺点:配置稍复杂,需要设置邮件服务器。
    • 配置难度:中等,需要配置邮件服务器参数。
  5. 监控模式(Monitor-only Mode)
    • 优点:不涉及外部服务,仅用于监控。
    • 缺点:不自动更新,需要手动重启容器。
    • 配置难度:简单,只需添加--monitor-only标志。

如果您正在寻找最简单的配置方式,并且已经有了Slack或Microsoft Teams账户,那么配置Slack或Microsoft Teams通知可能是最简单的,因为它们通常只需要获取一个Webhook URL并将其作为环境变量配置到Watchtower中。

如果您没有这些服务,或者更倾向于自托管解决方案,那么Gotify可能是一个简单的选择,尽管它需要一些初始设置。

如果您只是想监控更新而不实际应用它们,那么使用--monitor-only模式可能是最简单的,因为它不需要任何额外的配置,只需要在运行Watchtower时添加一个标志。

总的来说,选择哪种方式取决于您的具体需求和环境。对于大多数用户来说,Slack或Microsoft Teams通知可能是最简单直接的方式。

自动更新docker容器配置

对需要自行更新的 docker 容器,只需要添加标签:--label com.centurylinklabs.watchtower.enable=true 即可,添加了这个标签的容器会被 watchtower 监控并自动更新。

docker-compose 格式如下:

version: '3'
services:
  yourapp:
    image: your-image:latest
    labels:
      - com.centurylinklabs.watchtower.enable=true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    # 其他容器配置...

定时任务方式配置

对于现在市面上有很多比较简单的可视化运维工具,1Panel、宝塔等都支持定时任务。可进行如下设置:

shell 脚本方式

请自行设置运行时间

#!/bin/bash

# 定义容器名称和镜像名称
container_name="your_container_name"
image_name="your_image_name"

# 检查是否有新的镜像可用
docker pull $image_name > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "发现新的镜像,停止原容器并创建新容器..."
    # 停止原容器
    docker stop $container_name > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo "原容器已停止"
    else
        echo "停止原容器失败"
        exit 1
    fi

    # 删除原容器
    docker rm $container_name > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo "原容器已删除"
    else
        echo "删除原容器失败"
        exit 1
    fi

    # 创建新容器
    docker run -d --name $container_name $image_name
    if [ $? -eq 0 ]; then
        echo "新容器已创建"
    else
        echo "创建新容器失败"
        exit 1
    fi
else
    echo "没有发现新的镜像"
fi

docker-compose 方式

#!/bin/bash

# 定义docker-compose文件路径
docker_compose_file="your_docker_compose_file.yml"
# 如:docker_compose_file="/etc/docker/watchtower/docker-compose.yml"

# 检查是否有新的镜像可用
docker-compose pull -q
if [ $? -eq 0 ]; then
    echo "发现新的镜像,停止原容器并创建新容器..."
    # 停止和删除原容器
    docker-compose down
    if [ $? -eq 0 ]; then
        echo "原容器已停止并删除"
    else
        echo "停止原容器失败"
        exit 1
    fi

    # 创建新容器
    docker-compose up -d
    if [ $? -eq 0 ]; then
        echo "新容器已创建"
    else
        echo "创建新容器失败"
        exit 1
    fi
else
    echo "没有发现新的镜像"
fi

温馨提示

这里说明一下,可能会有人认为,Watchtower 监控其他容器自动更新,那它本身会不会自动更新,是否也需要添加标签来使得它自身保持自动更新。以下是解释:

Watchtower 容器本身不需要添加 com.centurylinklabs.watchtower.enable=true 标签来自动更新。Watchtower 容器是用于监视和更新其他容器的。它不会自动更新自己,因为 Watchtower 容器不会解析或使用标签来触发自身的更新。要确保 Watchtower 容器自动更新,你需要使用其他机制来监视和更新 Watchtower 容器。一种常见的方法是使用系统级的自动更新机制,如使用操作系统的包管理器或其他工具来更新 Docker 镜像和容器。若你需要保持 Watchtower 更新,则需要用下面的命令来更新 Watchtower 容器:

docker-compose pull watchtower
docker-compose up -d watchtower

这将拉取最新的 Watchtower 镜像,并使用新的镜像重新启动 Watchtower 容器。

或者用上面定时任务的方式进行自动更新Watchtower 容器本身。

总结:Watchtower 容器的自动更新是指监视和更新其他容器,而不是更新自身。因此,在使用 Watchtower 时,你需要定期检查 Watchtower 容器的版本,并手动更新它以获取最新的功能和修复的漏洞。

说明:本文参考了Docker自动更新镜像方法(定时任务或Watchtower) – 如默星空博主的内容,在其基础上写了点自己研究的东西。

如果觉得本文对您有帮助,可以支持下博主,谢谢啦!!!

留言板 | 博客主页

评论

  1. 七梦
    Windows Edge 131.0.0.0
    四川省绵阳市 电信
    2 周前
    2024-12-09 3:55:18

    占个沙发!!!

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇