导出docker-compse.yml中docker镜像成tar文件
#!/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