Docker Compose 镜像检测脚本(支持自动扫描 + 手动输入 YAML)

在日常运维中,经常会遇到这样一个问题:

docker-compose 文件里定义了很多镜像,但本地是否已经存在不清楚

如果一个个 docker pulldocker images 去对比,会非常低效。

因此我们可以写一个脚本,自动解析 docker-compose.yaml 中的 image: 字段,并检查本地是否已经存在。


🚀 功能说明

这个脚本支持:

✔ 两种模式选择

  • 自动扫描当前目录 YAML 文件
  • 手动输入 YAML 文件路径(例如 /data/test.yaml

✔ 自动解析 compose 文件

  • 提取所有 image: 镜像
  • 去重处理

✔ 本地镜像检查

  • 判断是否已存在
  • 输出结果(存在 / 缺失)

📜 脚本内容

bash 复制代码
#!/bin/bash

set -euo pipefail

# =========================
# 命令行参数优先
# =========================
if [ $# -ge 1 ]; then
    YAML_PATH="$1"

else
    echo "========== YAML 文件选择 =========="
    echo "1. 自动扫描当前目录 YAML 文件"
    echo "2. 手动输入 YAML 文件路径"
    echo

    read -rp "请选择 [1-2]: " mode

    case "$mode" in
        1)
            mapfile -t yaml_files < <(
                find . -maxdepth 1 \( -name "*.yaml" -o -name "*.yml" \) | sort
            )

            if [ ${#yaml_files[@]} -eq 0 ]; then
                echo "❌ 当前目录未找到 YAML 文件"
                exit 1
            fi

            echo
            echo "发现以下 YAML 文件:"
            echo

            for i in "${!yaml_files[@]}"; do
                echo "$((i+1)). ${yaml_files[$i]}"
            done

            echo
            read -rp "请选择 YAML 序号: " num

            index=$((num-1))

            if [ "$index" -lt 0 ] || [ "$index" -ge "${#yaml_files[@]}" ]; then
                echo "❌ 序号无效"
                exit 1
            fi

            YAML_PATH="${yaml_files[$index]}"
            ;;

        2)
            read -rp "请输入 YAML 文件路径 (例如 /data/test.yaml): " YAML_PATH
            ;;

        *)
            echo "❌ 无效选择"
            exit 1
            ;;
    esac
fi

# =========================
# 文件检查
# =========================
if [ ! -f "$YAML_PATH" ]; then
    echo "❌ YAML 文件不存在: $YAML_PATH"
    exit 1
fi

echo
echo "📄 使用 YAML 文件: $YAML_PATH"
echo

# =========================
# 镜像检测
# =========================
docker compose -f "$YAML_PATH" config | \
awk '/image:/ {print $2}' | \
sort -u | \
while read -r image; do

    if docker image inspect "$image" >/dev/null 2>&1; then
        echo "✅ 存在: $image"
    else
        echo "❌ 缺失: $image"
    fi

done

🎯 使用方式

方式1:自动交互选择

bash 复制代码
bash check.sh

方式2:直接指定 YAML

bash 复制代码
bash check.sh /data/test.yaml

📌 输出示例

text 复制代码
📄 使用 YAML 文件: ./docker-compose.yaml

✅ 存在: nginx:1.25
✅ 存在: redis:7
❌ 缺失: mysql:8.0

💡 优化建议

如果用于生产环境,可以继续增强:

  • 支持自动 docker pull 缺失镜像
  • 输出 JSON 报告
  • 集成 CI/CD(GitLab / Jenkins)
  • 支持多 compose 文件批量扫描

🧠 总结

这个脚本的核心价值是:

把 docker-compose 镜像依赖检查自动化,避免部署前才发现镜像缺失的问题

相关推荐
夏日听雨眠2 小时前
Linux(printf函数输出问题,exit ,主函数参数,fork函数,文件系统调用)
linux·运维·服务器
阿火~2 小时前
linux部署nacos【无脑简单版】【支持ARM版本和X86版本】
linux·运维·服务器
故事还在继续吗2 小时前
Linux 系统调用与接口层
linux·运维·系统调用
暴力求解2 小时前
Linux---网络基础概念
linux·运维·服务器·网络·操作系统
IT召唤狮2 小时前
【Spug】面向中小企业的轻量级无 Agent 自动化运维平台 — 开源运维平台的破局者
运维·开源·自动化
沧州刺史2 小时前
k8s 拉取镜像时,请求提前断开(EOF)导致拉取失败
云原生·容器·kubernetes
AquaMriusC2 小时前
Windows11专业版使用虚拟化技术安装Linux(CentOS7)
linux·运维·服务器
狐狐生风2 小时前
LangGraph 生产级部署全解:FastAPI + Docker
python·docker·langchain·prompt·fastapi·langgraph·agentai
pengyi8710152 小时前
共享IP全面优缺点解析,适合什么人群使用?
linux·运维·服务器·网络·tcp/ip