#!/bin/bash # 版本号文件 VERSION_FILE=".version" # 默认镜像名称(与build-docker.sh保持一致) DEFAULT_IMAGE_NAME="crawler_zgjs" # 显示帮助信息 show_help() { echo "使用方法: $0 [选项]" echo echo "选项:" echo " -h, --help 显示帮助信息" echo " -v, --version 指定版本号(可选,默认使用.version文件中的版本)" echo " -n, --name 指定镜像名称(可选,默认为 $DEFAULT_IMAGE_NAME)" echo " -o, --output 指定输出文件路径(可选,默认为 {镜像名称}-{版本号}.tar)" echo echo "示例:" echo " $0 # 使用默认设置导出镜像" echo " $0 -v 1.0 # 导出指定版本的镜像" echo " $0 -n custom_name -v 2.0 # 导出指定名称和版本的镜像" echo " $0 -o /path/to/image.tar # 指定输出文件路径" } # 解析命令行参数 VERSION="" IMAGE_NAME="$DEFAULT_IMAGE_NAME" OUTPUT_FILE="" while [[ $# -gt 0 ]]; do case $1 in -h|--help) show_help exit 0 ;; -v|--version) VERSION="$2" shift 2 ;; -n|--name) IMAGE_NAME="$2" shift 2 ;; -o|--output) OUTPUT_FILE="$2" shift 2 ;; *) echo "❌ 错误: 未知参数 $1" show_help exit 1 ;; esac done # 如果未指定版本,从文件读取 if [ -z "$VERSION" ]; then if [ -f "$VERSION_FILE" ] && [ -s "$VERSION_FILE" ]; then VERSION=$(cat "$VERSION_FILE") else echo "❌ 错误: 未指定版本且无法从 $VERSION_FILE 读取版本号" exit 1 fi fi # 构建完整的镜像标签 TAG="$IMAGE_NAME:$VERSION" # 如果未指定输出文件,使用默认命名 if [ -z "$OUTPUT_FILE" ]; then OUTPUT_FILE="${IMAGE_NAME}-${VERSION}.tar" fi # 检查镜像是否存在 if ! docker image inspect "$TAG" >/dev/null 2>&1; then echo "❌ 错误: 镜像 $TAG 不存在" echo "提示: 请先使用 build-docker.sh 构建镜像" exit 1 fi echo "🚀 开始导出Docker镜像..." echo "📦 镜像: $TAG" echo "📄 输出: $OUTPUT_FILE" # 导出镜像 if docker save -o "$OUTPUT_FILE" "$TAG"; then echo "✅ 导出成功!" echo "📁 文件大小: $(du -h "$OUTPUT_FILE" | cut -f1)" else echo "❌ 导出失败!" # 如果导出失败,清理可能部分写入的文件 [ -f "$OUTPUT_FILE" ] && rm "$OUTPUT_FILE" exit 1 fi