在運維工作中,如何批量將當前目錄下所有的 .tar 鏡像文件通過 docker load -i 導入到本地 Docker 環境中,并顯示進度和結果。
當然可以!以下是一個完整的 Shell 腳本,用于:
- 批量
docker load -i xxx.tar導入鏡像 - 為每個鏡像打上指定 Harbor 倉庫的標簽(tag)
- 推送到 Harbor 鏡像倉庫
?? 假設信息(請根據實際情況修改)
- Harbor 地址:
harbor.example.com - 項目名稱:
myproject - 版本標簽:
v3.4.0(從文件名提取也可自定義) - Harbor 用戶名/密碼:
admin / Harbor12345
示例:將
alarm-handler-v3.4.0_20250725104119.tar→ 推送為harbor.example.com/myproject/alarm-handler:v3.4.0
? 完整腳本:load_and_push_to_harbor.sh
#!/bin/bash
# ========================================
# 批量導入并推送 Docker 鏡像到 Harbor
# 作者: Assistant
# 時間: $(date '+%Y-%m-%d %H:%M')
# ========================================
# ?? 配置區(請按需修改)
HARBOR_REGISTRY="harbor.example.com" # 替換為你的 Harbor 地址
HARBOR_PROJECT="myproject" # 替換為你的項目名
IMAGE_VERSION="v3.4.0" # 鏡像版本標簽(可統一設置)
HARBOR_USER="admin" # Harbor 用戶名
HARBOR_PASS="Harbor12345" # Harbor 密碼(建議使用 token 更安全)
# 統計變量
success_load=0
fail_load=0
success_push=0
fail_push=0
total=0
echo "=========================================="
echo " 開始批量導入并推送到 Harbor"
echo " Registry: $HARBOR_REGISTRY/$HARBOR_PROJECT"
echo " 當前時間: $(date '+%Y-%m-%d %H:%M:%S')"
echo "=========================================="
# 檢查是否安裝 docker
if ! command -v docker &> /dev/null; then
echo "? 錯誤: docker 未安裝或不在 PATH 中。"
exit 1
fi
# 登錄 Harbor
echo "?? 正在登錄 Harbor: $HARBOR_REGISTRY"
if docker login "$HARBOR_REGISTRY" -u "$HARBOR_USER" -p "$HARBOR_PASS" > /tmp/docker_login.log 2>&1; then
echo "? Harbor 登錄成功"
else
echo "? Harbor 登錄失敗,請檢查用戶名/密碼或網絡"
cat /tmp/docker_login.log
rm -f /tmp/docker_login.log
exit 1
fi
rm -f /tmp/docker_login.log
# 遍歷所有 .tar 文件
for tar_file in *.tar; do
# 跳過無匹配文件
if [ ! -f "$tar_file" ]; then
echo "?? 當前目錄沒有找到任何 .tar 文件。"
break
fi
total=$((total + 1))
image_base=$(basename "$tar_file" .tar) # 如 alarm-handler-v3.4.0_20250725104119
image_name_part=$(echo "$image_base" | sed -E 's/-v[0-9]+\.[0-9]+\.[0-9]+.*//') # 提取 service 名稱
echo
echo "?? 處理文件: $tar_file"
# 1. Load 鏡像
echo " ? 導入鏡像: docker load -i $tar_file"
LOADED_IMAGE=$(docker load -i "$tar_file" 2>/dev/null | grep "Loaded image:" | sed 's/^Loaded image: //')
if [ -z "$LOADED_IMAGE" ]; then
echo " ? 導入失敗或未識別鏡像名"
fail_load=$((fail_load + 1))
continue
else
echo " ? 導入成功,鏡像名: $LOADED_IMAGE"
success_load=$((success_load + 1))
fi
# 構建目標鏡像名
DEST_IMAGE="$HARBOR_REGISTRY/$HARBOR_PROJECT/$image_name_part:$IMAGE_VERSION"
# 2. 打標簽
echo " ??? 打標簽: $DEST_IMAGE"
if docker tag "$LOADED_IMAGE" "$DEST_IMAGE"; then
echo " ? 標簽成功"
else
echo " ? 打標簽失敗"
fail_push=$((fail_push + 1))
continue
fi
# 3. 推送到 Harbor
echo " ?? 推送鏡像: $DEST_IMAGE"
if docker push "$DEST_IMAGE"; then
echo " ? 推送成功"
success_push=$((success_push + 1))
else
echo " ? 推送失敗"
fail_push=$((fail_push + 1))
fi
done
# 輸出統計結果
echo
echo "=========================================="
echo "?? 批量操作完成 summary:"
echo " 總共處理: $total 個文件"
echo " 成功導入: $success_load"
echo " 導入失敗: $fail_load"
echo " 成功推送: $success_push"
echo " 推送失敗: $fail_push"
echo "=========================================="
# 如果有失敗,給出提示
if [ $fail_load -gt 0 ] || [ $fail_push -gt 0 ]; then
echo "?? 建議檢查:"
echo " - 鏡像文件是否完整(file *.tar)"
echo " - Docker 是否運行(systemctl status docker)"
echo " - Harbor 地址/項目名是否正確"
echo " - 網絡是否可達 Harbor"
exit 1
fi
exit 0
?? 使用方法
- 保存腳本
vim load_and_push_to_harbor.sh
# 粘貼內容后保存
- 修改配置項
HARBOR_REGISTRY="your.harbor.com"
HARBOR_PROJECT="prod/dataexa"
HARBOR_USER="robot\$xxx"
HARBOR_PASS="xxxxx"
?? 生產環境建議使用 Harbor Robot Account Token 替代明文密碼。
- 添加執行權限
chmod +x load_and_push_to_harbor.sh
- 運行腳本
./load_and_push_to_harbor.sh
?? 如果權限不足,可加
sudo,但注意sudo下可能無法讀取用戶配置的 Docker 憑據,推薦用普通用戶并加入docker組。
? 示例最終推送效果
| 原始文件 | 推送后鏡像 |
|---|---|
alarm-handler-v3.4.0_20250725104119.tar |
harbor.example.com/myproject/alarm-handler:v3.4.0 |
video-handler-v3.4.0_20250725104119.tar |
harbor.example.com/myproject/video-handler:v3.4.0 |
?? 可選增強功能(如需可追加)
- 支持從文件名自動提取版本號(如
v3.4.0) - 并行推送加速
- 記錄日志到文件
- 支持 HTTPS 自簽名證書跳過
- 加入
--dry-run模式預覽

浙公網安備 33010602011771號