脚本介绍
这个脚本用于检查正在运行的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
评论区