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

相关推荐
梦想的旅途216 分钟前
企业微信API如何实现自动化办公
运维·自动化·企业微信
刚入门的大一新生20 分钟前
Linux-命令行参数和环境变量
linux·运维·服务器
我星期八休息1 小时前
Linux I/O多路转接—epoll
java·linux·运维·服务器·开发语言·jvm·算法
大模型码小白1 小时前
AI 提示词专栏:使用系统指令(System Prompt)实现全局约束
java·大数据·运维·开发语言·人工智能·python·prompt
AI备忘录2 小时前
(十六)GRE/IPSec 隧道配置命令五厂商对照:华为 华三 锐捷 迈普 思科
运维·服务器·网络·网络协议·网络安全·华为
DO_Community2 小时前
面向 AI 工作负载,单核性能提升 30%:DigitalOcean v5 Droplets 云服务器正式上线
运维·服务器·人工智能
广凌股份(广凌科技)2 小时前
广凌智慧教室融合管理平台|现代技术如何改善课堂体验?
运维·人工智能·物联网
武汉誉天3 小时前
AI运维课程都学什么内容?
运维·人工智能
MyFreeIT3 小时前
Docker Network
运维·docker·容器
捷烽3 小时前
三大运营商熔接损耗验收:国家规范与0.08dB的正确理解
运维·网络·信息与通信