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

相关推荐
SelectDB18 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
曲幽1 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
武子康3 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn866 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker