如何使用Shell脚本拉取和推送多个Docker镜像?
批量处理Docker镜像的Shell脚本扩展方案
核心思路
把单镜像的处理逻辑封装成函数,通过遍历指定的镜像列表实现批量处理,既保留原有逻辑(拉取、判断存在性、备份+推送/直接推送),又能灵活扩展到多个镜像。
完整示例脚本
#!/bin/bash # 目标仓库路径,根据实际情况修改 D_PATH="your-target-repo.example.com" # 定义单镜像处理函数 process_image() { local docker_image="$1" # 拉取源镜像,拉取失败则跳过 if ! docker pull "$docker_image"; then echo "❌ 拉取镜像 $docker_image 失败,跳过处理" return 1 fi # 提取镜像名称(去掉源仓库前缀) local image_name=$(echo "$docker_image" | cut -d / -f 2-) echo "🔍 处理镜像:$image_name" # 检查目标仓库是否已有该镜像 if docker pull "${D_PATH}/${image_name}" 2>&1 | grep -E '(not found|no such|unable to|ERROR)' >/dev/null; then echo "✅ 目标仓库无该镜像,直接打标签并推送" docker tag "$docker_image" "${D_PATH}/${image_name}" docker push "${D_PATH}/${image_name}" else echo "⚠️ 目标仓库已存在该镜像,先备份再推送" # 生成带时间戳的备份标签,避免覆盖 local backup_tag="backup_$(date +%Y%m%d_%H%M%S)" # 备份现有镜像 docker tag "${D_PATH}/${image_name}" "${D_PATH}/${image_name}:${backup_tag}" docker push "${D_PATH}/${image_name}:${backup_tag}" # 推送新镜像覆盖原标签 docker tag "$docker_image" "${D_PATH}/${image_name}" docker push "${D_PATH}/${image_name}" fi } # 要批量处理的镜像列表,可按需添加/修改 TARGET_IMAGES=( "nginx:latest" "redis:6.2" "mysql:8.0" "your-custom-image:v1.0" ) # 遍历镜像列表,逐个处理 for img in "${TARGET_IMAGES[@]}"; do echo "=====================================" process_image "$img" done
关键说明
- 函数封装:把单镜像的处理逻辑放到
process_image函数中,代码更易维护,遍历调用更简洁。 - 镜像列表管理:用数组
TARGET_IMAGES存储要处理的镜像,支持任意数量的镜像,修改起来更直观。 - 备份逻辑优化:用时间戳作为备份标签,确保每个备份唯一,避免备份被覆盖。
- 错误处理:拉取源镜像失败时直接跳过该镜像,避免影响后续镜像的处理。
关于你提到的遍历命令
你看到的for image in $(docker images --format "{{.Repository}}"); do docker pull $image; done确实可以遍历本地已有的镜像仓库名并拉取,但它存在两个局限:
- 会处理本地所有镜像,包括你不需要批量推送的无关镜像;
- 无法区分源镜像和目标仓库的镜像逻辑,不贴合你的备份+推送需求。
因此更推荐用上述指定镜像列表+函数封装的方案,精准控制要处理的镜像。
内容的提问来源于stack exchange,提问作者Khushi
相关产品推荐
相关产品推荐

