第一步:在线环境压缩离线镜像:
需要两个文件,第一个是脚本文件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 ]; thenlog "错误:参数不足。"print_helpexit 1
fi# 参数1: save / load
operation="$1"# 执行操作前的参数检查
if [ "$operation" == "save" ]; thenif [ "$#" -ne 3 ]; thenlog "错误:'save' 操作需要两个参数。"print_helpexit 1fiinput_file="$2"output_tar="$3"# 检查文件是否存在if [ ! -f "$input_file" ]; thenlog "错误:文件 '$input_file' 不存在。"exit 1fi# 检查输出文件是否存在,如果存在先删除if [ -f "$output_tar" ]; thenlog "删除已存在的输出文件: $output_tar"rm "$output_tar"fi# 检查输出文件是否存在,如果存在先删除if [ -f "imageid_list.txt" ]; thenlog "删除已存在的镜像id文件: imageid_list.txt"rm "imageid_list.txt"fiwhile IFS= read -r line; do# 忽略空白行和以 '#' 开头的注释行if [ -z "$line" ] || [[ "$line" == \#* ]]; thencontinuefiimage_name=$(echo "$line" | awk -F':' '{print $1}')image_tag=$(echo "$line" | awk -F':' '{print $2}')log "拉取镜像image_name: $image_name,image_tag:$image_tag"log "拉取镜像: $line"podman pull "$line"image_tags=$(podman images | grep "$image_name" | awk '{print $2}')image_ids=$(podman images | grep "$image_name" | awk '{print $3}')
read -r -d '' -a image_tags_array <<< "$image_tags"
read -r -d '' -a image_ids_array <<< "$image_ids"length=${#image_tags_array[@]}
for ((i=0; i<$length; i++))
do# 获取数组中的元素tag=${image_tags_array[i]}id=${image_ids_array[i]}log "tag: $tagid: $id"if [ "$tag" == "$image_tag" ]; thenecho $id >> imageid_list.txtbreakfi# 在这里插入处理标签和ID的代码
donecat imageid_list.txtdone < "$input_file"log "保存镜像到 $output_tar"podman save -o "$output_tar" $(cat imageid_list.txt)log "镜像已成功保存到 $output_tar。"elif [ "$operation" == "load" ]; thenif [ "$#" -ne 2 ]; thenlog "错误:'load' 操作需要一个参数。"print_helpexit 1fiinput_tar="$2"# 检查文件是否存在if [ ! -f "$input_tar" ]; thenlog "错误:文件 '$input_tar' 不存在。"exit 1fi# 获取当前 Podman 存放镜像的目录空间信息store_path=$(podman 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" ]; thenlog "错误:存放 Podman 镜像的目录空间不足以容纳加载的 tar 包。"exit 1filog "加载镜像: $input_tar"podman load -i "$input_tar"log "镜像已成功加载。"#需要将镜像tag为#podman tag image.cestc.cn/iaas_pub/buildah:20231019 image.ccos.io/iaas_pub/buildah:20231019elif [ "$operation" == "tag" ]; thenif [ "$#" -ne 3 ]; thenlog "错误:'tag' 操作需要2个参数。"print_helpexit 1fiimage_list_file="$2"imageid_list_file="$3"while IFS= read -r line1 <&3 && IFS= read -r line2 <&4; doimage=$(echo "$line1" | awk -F'/' '{print $3}')podman tag "$line2" image.ccos.io/iaas_pub/"$image"done 3< "$image_list_file" 4< "$imageid_list_file"elselog "错误:无效的操作。"print_helpexit 1
fi