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

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

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

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

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


🚀 功能说明

这个脚本支持:

✔ 两种模式选择

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

✔ 自动解析 compose 文件

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

✔ 本地镜像检查

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

📜 脚本内容

#!/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 check.sh

方式2:直接指定 YAML

bash check.sh /data/test.yaml

📌 输出示例

📄 使用 YAML 文件: ./docker-compose.yaml

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

💡 优化建议

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

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

🧠 总结

这个脚本的核心价值是:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值