#!/bin/bash
# 確保腳本在正確的目錄下運行
SCRIPT_DIR=$(dirname "$(realpath "$0")")
cd "$SCRIPT_DIR" || exit 1# 定義docker-compose文件路徑
COMPOSE_FILE="${SCRIPT_DIR}/docker-compose.yml"# 創建導出目錄
EXPORT_DIR="${SCRIPT_DIR}/docker_images"
mkdir -p "$EXPORT_DIR"# 檢查是否安裝了docker
if ! command -v docker &> /dev/null; then
? ? echo "錯誤: 未找到docker命令,請先安裝docker。"
? ? exit 1
fi# 檢查docker-compose文件是否存在
if [ ! -f "$COMPOSE_FILE" ]; then
? ? echo "錯誤: 未找到docker-compose文件: $COMPOSE_FILE"
? ? exit 1
fi# 從docker-compose.yml提取鏡像列表
echo "正在從 $COMPOSE_FILE 提取鏡像列表..."
IMAGES=$(grep -oP 'image:\s*\K[^"\s]+' "$COMPOSE_FILE" | sort -u)if [ -z "$IMAGES" ]; then
? ? echo "錯誤: 在docker-compose文件中未找到鏡像定義"
? ? exit 1
fiecho "找到以下鏡像需要導出:"
echo "$IMAGES" | while read -r image; do
? ? echo "- $image"
done
echo# 導出鏡像函數
export_image() {
? ? local image=$1
? ? local tar_file="${EXPORT_DIR}/${image//[:\/]/-}.tar"
? ??
? ? echo "正在導出鏡像: $image"
? ? echo "目標文件: $tar_file"
? ??
? ? # 檢查鏡像是否存在
? ? if ! docker image inspect "$image" &> /dev/null; then
? ? ? ? echo "警告: 鏡像 $image 不存在,跳過導出"
? ? ? ? return 1
? ? fi
? ??
? ? # 導出鏡像
? ? docker save -o "$tar_file" "$image"
? ??
? ? if [ $? -eq 0 ]; then
? ? ? ? local size=$(du -h "$tar_file" | cut -f1)
? ? ? ? echo "成功導出 $image (大小: $size)"
? ? else
? ? ? ? echo "導出 $image 失敗"
? ? ? ? return 1
? ? fi
}# 導出所有鏡像
echo "開始導出鏡像..."
echo "$IMAGES" | while read -r image; do
? ? export_image "$image" || export_errors=true
done# 輸出結果
echo
echo "鏡像導出完成!"
echo "導出的鏡像位于: $EXPORT_DIR"if [ -n "$export_errors" ]; then
? ? echo "注意: 導出過程中存在錯誤,請檢查上面的輸出。"
? ? exit 1
else
? ? echo "所有鏡像均已成功導出。"
? ? exit 0
fi ? ?