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 镜像依赖检查自动化,避免部署前才发现镜像缺失的问题

相关推荐
万能的知了7 小时前
服务器托管 vs 云主机 vs 裸金属:一个决策故事
运维·服务器·云计算
杨云龙UP7 小时前
Oracle RAC / ODA 生产环境指定 PDB 启动 SOP
linux·运维·数据库·oracle
luweis8 小时前
企智孪生 ETA(3.3 认知算法层:ETA 的思维内核 3.4 基础架构:算力与弹性)【浙江联保网络 卢伟舜】
大数据·运维·线性代数·ai·矩阵·学习方法
极客老王说Agent8 小时前
屏幕理解能力是下一代自动化的关键吗?2026年自动化范式演进深度解析
运维·人工智能·ai·chatgpt·自动化
LT10157974449 小时前
2026年电商RPA选型指南:电商运营全流程自动化测评
运维·自动化·rpa
JAVA社区9 小时前
Java高级全套教程(十一)—— Kubernetes 超详细企业级实战详解
java·运维·微服务·容器·面试·kubernetes
lihao lihao11 小时前
linux匿名管道
linux·运维·服务器
STDD11 小时前
Farming Simulator 25(模拟农场 25) Linux 专服搭建完全指南
linux·运维·javascript
STDD11 小时前
Glances:跨平台系统资源监控,浏览器实时查看服务器状态
运维·服务器