侧边栏壁纸
  • 累计撰写 7 篇文章
  • 累计创建 7 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

批量检查 Docker 容器镜像更新并提供更新命令

ManJieqi
2023-12-30 / 0 评论 / 0 点赞 / 57 阅读 / 0 字

脚本介绍

这个脚本用于检查正在运行的Docker容器是否使用了最新的镜像,并提供更新命令。

脚本首先获取所有正在运行的容器和它们所使用的镜像,然后遍历每个容器,检查它们所使用的镜像是否有更新。

如果发现镜像有更新,脚本会输出容器名称、镜像名称以及更新命令,以便用户可以及时更新容器所使用的镜像。

补充说明

脚本中使用了docker inspect命令来获取容器的compose文件路径,然后使用sudo apt install jq来解析 JSON 格式的输出。

这部分逻辑是基于容器是通过compose文件启动的假设,如果容器是通过docker run命令启动的,则该脚本不可用。

#!/bin/bash

# 获取所有正在运行的容器和镜像名称
containers=$(docker ps --format "{{.Names}} {{.Image}}")

# 遍历容器
while IFS= read -r container; do
    # 分割容器镜像名称
    container_name=$(echo $container | awk '{print $1}')
    image_name=$(echo $container | awk '{print $2}')
    
    # 如果镜像没有标签,则使用latest作为默认标签
    if [[ ! $image_name == *":"* ]]; then
        image_name="${image_name}:latest"
    fi
    
    # 获取本地镜像的ID
    local_image_id=$(docker inspect --format='{{.Id}}' $image_name)
    
    # 拉取最新的镜像信息
    docker pull $image_name > /dev/null 2>&1
    
    # 获取更新后的本地镜像的ID
    updated_image_id=$(docker inspect --format='{{.Id}}' $image_name)
    
    # 比较镜像ID来检查是否有更新
    if [ "$local_image_id" != "$updated_image_id" ]; then
        printf "容器 %-12s 使用的镜像 %-35s \033[31m存在更新。\033[0m\n" "$container_name" "$image_name"
        compose_file=$(docker inspect --format='{{json .Config.Labels}}' $container_name | jq -r '.["com.docker.compose.project.config_files"]')
        echo -e "\033[31m更新命令: docker compose -f $compose_file up -d\033[0m"
    else
        printf "容器 %-12s 使用的镜像 %-35s \033[32m是最新的。\033[0m\n" "$container_name" "$image_name"
    fi
done <<< "$containers"

更新版

避免未及时更新导致下次运行脚本时无法正确获取镜像名,无需安装jq

#!/bin/bash

# 获取所有正在运行的容器
containers=$(docker ps --format "{{.Names}}")

# 遍历容器
for container_name in $containers; do
    # 获取容器使用的镜像ID和镜像名
    image_id=$(docker inspect --format='{{.Image}}' "$container_name")
    image_name=$(docker inspect --format='{{.Config.Image}}' "$container_name")

    # 拉取最新的镜像信息 (静默模式)
    docker pull "$image_name" &> /dev/null
    pull_status=$?

    # 检查拉取命令是否成功
    if [ $pull_status -ne 0 ]; then
        printf "容器 %-16s 使用的镜像 %-35s \033[31m拉取失败。\033[0m\n" "$container_name" "$image_name"
        continue
    fi

    # 获取更新后的镜像ID
    updated_image_id=$(docker inspect --format='{{.Id}}' "$image_name")

    # 比较镜像ID来检查是否有更新
    if [ "$image_id" != "$updated_image_id" ]; then
        printf "容器 %-16s 使用的镜像 %-35s \033[31m存在更新。\033[0m\n" "$container_name" "$image_name"
        compose_file=$(docker inspect --format='{{json .Config.Labels}}' "$container_name" | jq -r '.["com.docker.compose.project.config_files"]')
        echo -e "\033[31m更新命令: docker compose -f $compose_file up -d\033[0m"
    else
        printf "容器 %-16s 使用的镜像 %-35s \033[32m是最新的。\033[0m\n" "$container_name" "$image_name"
    fi
done

0

评论区