在日常运维中,经常会遇到这样一个问题:
docker-compose 文件里定义了很多镜像,但本地是否已经存在不清楚
如果一个个 docker pull 或 docker 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 镜像依赖检查自动化,避免部署前才发现镜像缺失的问题