docker保存镜像的脚本

#!/bin/bash

# 获取docker images输出,提取镜像名称和标签,并存入数组
image_list=($(docker images --format '{
     
     {.Repository}}:{
     
     {.Tag}}'))

# 检查是否有镜像
if [ ${
    
    #image_list[@]} -eq 0 ]; then
    echo "No images found."
    exit 1
fi

# 显示镜像列表供用户选择
echo "Available images:"
for i in "${
     
     !image_list[@]}"; do
    image="${image_list[$i]}"
    
    # 获取镜像名称,如果包含 '/' 则以最后一个 '/' 为分隔符提取
    image_name="${image##*/}"

    echo "[$i] $image_name ($image)"
done

# 请求用户选择镜像
read -p "Enter the index of the image to save: " choice

# 验证用户输入是否为有效数字
re='^[0-9]+$'
if ! [[ $choice =~ $re ]]; then
   echo "Error: Invalid input, please enter a number."
   exit 1
fi

# 验证用户选择是否在范围内
if (( choice < 0 || choice >= ${#image_list[@]} )); then
    echo "Error: Index out of range."
    exit 1
fi

# 获取用户选择的镜像名称和标签
selected_image="${image_list[$choice]}"

# 获取镜像的最后部分作为文件名
image_name="${selected_image##*/}"

# 生成文件名时,将 ':' 替换为 '_'
image_filename="${image_name//:/_}"

# 使用镜像名称和标签(repository:tag)来生成文件名
timestamp=$(date +"%Y%m%d%H%M%S")
output_file="${image_filename}_$timestamp.tar"

echo "Saving image '$selected_image' as $output_file..."
docker save -o "$output_file" "$selected_image"

echo "Image saved successfully."