当前位置: 首页 > article >正文

加载离线镜像包:在线镜像离线为tar包、tar离线镜像包加载并根据imageId打tag

第一步:在线环境压缩离线镜像:

需要两个文件,第一个是脚本文件image_offline_load.sh脚本,第二个是image_list.txt 按行 存放需要离线的镜像名称

./image_offline_load.sh save image_list.txt output.tar

在这里插入图片描述

第二步:在离线环境中加载离线镜像并打tag:

需要四个文件,第一个是第一步生成的压缩包output.tar,第二个是脚本文件image_offline_load.sh脚本,第三个是image_list.txt 按行 存放需要离线的镜像名称,第四个是第一步生成的 imageid_list.txt 存放离线的镜像id

./image_offline_load.sh load output.tar
./image_offline_load.sh tag image_list.txt imageid_list.txt

在这里插入图片描述

脚本文件image_offline_load.sh如下,包括save、load 、tag功能

save <image_list_file> <output_tar_file> 保存镜像到 tar 归档文件"
load <input_tar_file> 加载 tar 归档文件到本地"
tag <image_list_file> <imageid_list_file> 对本地镜像打tag"


#!/bin/bash

# 打印帮助信息
print_help() {
    echo "用法: $0 <操作> <参数1> [<参数2>]"
    echo "操作:"
    echo "  save <image_list_file> <output_tar_file>   保存镜像到 tar 归档文件"
    echo "  load <input_tar_file>                     加载 tar 归档文件到本地"
    echo "  tag <image_list_file>    <imageid_list_file>    对本地镜像打tag"
}

# 记录日志
log() {
    echo "$(date +'%Y-%m-%d %H:%M:%S') - $1"
}

# 参数数量检查
if [ "$#" -lt 2 ]; then
    log "错误:参数不足。"
    print_help
    exit 1
fi

# 参数1: save / load
operation="$1"

# 执行操作前的参数检查
if [ "$operation" == "save" ]; then
    if [ "$#" -ne 3 ]; then
        log "错误:'save' 操作需要两个参数。"
        print_help
        exit 1
    fi

    input_file="$2"
    output_tar="$3"

    # 检查文件是否存在
    if [ ! -f "$input_file" ]; then
        log "错误:文件 '$input_file' 不存在。"
        exit 1
    fi

    # 检查输出文件是否存在,如果存在先删除
    if [ -f "$output_tar" ]; then
        log "删除已存在的输出文件: $output_tar"
        rm "$output_tar"
    fi
   # 检查输出文件是否存在,如果存在先删除
    if [ -f "imageid_list.txt" ]; then
        log "删除已存在的镜像id文件: imageid_list.txt"
        rm "imageid_list.txt"
    fi
    while IFS= read -r line; do
        # 忽略空白行和以 '#' 开头的注释行
        if [ -z "$line" ] || [[ "$line" == \#* ]]; then
            continue
        fi
        iamge_name=$(echo "$line" | awk -F':' '{print $1}')
        log "拉取镜像: $line"
        docker pull "$line"
        docker images | grep "$iamge_name" | awk '{print $3}' >> imageid_list.txt
        cat imageid_list.txt
    done < "$input_file"

    log "保存镜像到 $output_tar"
    docker save -o "$output_tar" $(cat imageid_list.txt)
    log "镜像已成功保存到 $output_tar。"

elif [ "$operation" == "load" ]; then
    if [ "$#" -ne 2 ]; then
        log "错误:'load' 操作需要一个参数。"
        print_help
        exit 1
    fi

    input_tar="$2"

    # 检查文件是否存在
    if [ ! -f "$input_tar" ]; then
        log "错误:文件 '$input_tar' 不存在。"
        exit 1
    fi

    # 获取当前 docker 存放镜像的目录空间信息
    store_path=$(docker info --format '{{.Store.GraphRoot}}')
    available_space=$(df -k "$store_path" | awk 'NR==2 {print $4}')  # 获取可用空间,单位为 KB

    # 获取要加载的 tar 包大小
    tar_size=$(du -k "$input_tar" | awk '{print $1}')  # 获取 tar 包大小,单位为 KB

    # 检查是否有足够的空间容纳 tar 包
    if [ "$available_space" -lt "$tar_size" ]; then
        log "错误:存放 docker 镜像的目录空间不足以容纳加载的 tar 包。"
        exit 1
    fi

    log "加载镜像: $input_tar"
    docker load -i "$input_tar"

    log "镜像已成功加载。"


elif [ "$operation" == "tag" ]; then
    if [ "$#" -ne 3 ]; then
        log "错误:'tag' 操作需要2个参数。"
        print_help
        exit 1
    fi
    image_list_file="$2"
    imageid_list_file="$3"
    while IFS= read -r line1 <&3 && IFS= read -r line2 <&4; do
    image=$(echo "$line1" | awk -F'/' '{print $3}')

    docker tag "$line2" image.ccos.io/iaas_pub/"$image"

done 3< "$image_list_file" 4< "$imageid_list_file"

else
    log "错误:无效的操作。"
    print_help
    exit 1
fi

http://www.kler.cn/a/161228.html

相关文章:

  • 力扣每日一题 3258. 统计满足 K 约束的子字符串数量 I
  • 服务器数据恢复—分区结构被破坏的reiserfs文件系统数据恢复案例
  • 如何在有限内存下对外部大文件进行排序
  • wordpress实用功能A5资源网同款 隐藏下载框 支付框 需要登录才能查看隐藏的内容
  • SpringBoot单体服务无感更新启动,动态检测端口号并动态更新
  • MYSQL隔离性原理——MVCC
  • INFINI Easysearch 与华为鲲鹏完成产品兼容互认证
  • 【文件上传系列】No.0 利用 FormData 实现文件上传、监控网路速度和上传进度(原生前端,Koa 后端)
  • 获取MATLAB默认配色方案
  • Git初学入门指令
  • Android平板还能编程?Ubuntu本地安装code-server远程编程写代码
  • Mysql综合案例练习<1>
  • SpringbootWeb登录认证
  • 【JavaScript】JS——Map数据类型
  • 视频监控管理平台/智能监测/检测系统EasyCVR智能地铁监控方案,助力地铁高效运营
  • 用23种设计模式打造一个cocos creator的游戏框架----(四)装饰器模式
  • MySQl int(1)、int(20) 的区别到底在哪里
  • JVM虚拟机(已整理,已废弃)
  • Spring Cache快速入门教程及案例
  • Java程序员,你掌握了多线程吗?【文末送书】
  • js取出对象数组某个属性拼接成字符串或者取出某些属性组成新的数组
  • 【C/PTA】结构体进阶练习
  • 将图像增广应用于Mnist数据集
  • scp 指令详细介绍
  • activemq启动成功但web管理页面却无法访问
  • 多人聊天Java