docker加载本地镜像并修改tag上传私有仓库

#!/bin/bash

# Docker镜像批量处理脚本
# 作者: 运维
# 用途: 加载本地docker镜像并修改标签
# 使用: ./docker_info.sh registry.example.com

# 检查参数
if [ $# -ne 1 ]; then
    echo "用法: $0 <私有仓库地址>"
    echo "示例: $0 registry.example.com"
    exit 1
fi

# 检查docker命令是否可用
if ! command -v docker; then
    echo "错误: 未检测到docker命令,请确认docker是否已安装并在系统路径中"
    exit 1
fi

# 检查docker服务是否运行
if ! docker info; then
    echo "错误: docker服务未运行,请先启动docker服务"
    exit 1
fi

# 定义变量
REGISTRY_URL=$1
WORK_DIR=$(pwd)

# 检查当前目录是否有tar文件
tar_count=$(ls -1 *.tar 2>/dev/null | wc -l)
if [ $tar_count -eq 0 ]; then
    echo "错误: 当前目录下没有找到.tar格式的docker镜像文件"
    exit 1
fi

# 创建临时文件存储加载的镜像列表
temp_image_list=$(mktemp)
# 这行代码使用trap命令在脚本退出(EXIT)时自动删除临时文件
# rm -f 用于强制删除以下临时文件:
# - $temp_image_list: 存储加载的镜像列表的临时文件
# - /tmp/before_load.txt: 记录加载前的镜像列表
# - /tmp/after_load.txt: 记录加载后的镜像列表
# 这样可以确保脚本退出时清理所有临时文件
#trap 'rm -f $temp_image_list /tmp/before_load.txt /tmp/after_load.txt' EXIT

# 记录加载前的镜像列表
docker images --format "{{.Repository}}:{{.Tag}}" > /tmp/before_load.txt

# 加载当前目录下的所有docker镜像文件并记录新增的镜像
echo "开始加载docker镜像文件..."
for image_file in *.tar; do
    if [ -f "$image_file" ]; then
        echo "正在加载 $image_file ..."
        if ! docker load -i "$image_file"; then
            echo "警告: 加载 $image_file 失败"
            continue
        fi
        # 记录加载后的镜像列表
        docker images --format "{{.Repository}}:{{.Tag}}" > /tmp/after_load.txt
        # 找出新增的镜像
        comm -13 /tmp/before_load.txt /tmp/after_load.txt >> $temp_image_list
        # 更新before_load.txt为当前状态
        cp /tmp/after_load.txt /tmp/before_load.txt
    fi
done

# 检查是否有成功加载的镜像
if [ ! -s "$temp_image_list" ]; then
    echo "错误: 没有成功加载任何镜像"
    exit 1
fi

# 显示本次加载的镜像列表
echo -e "\n本次加载的镜像列表:"
cat $temp_image_list

# 仅为本次加载的镜像修改标签
echo -e "\n开始修改镜像标签..."
while read image; do
    # 获取镜像名和标签
    image_name=$(echo $image | awk -F'/' '{print $(NF-1)}')
    image_tag=$(echo $image | cut -d':' -f2)
    # 构建新的镜像标签
    new_image="${REGISTRY_URL}/${image_name}:${image_tag}"
    
    echo "将 $image 改为 $new_image"
    if ! docker tag $image $new_image; then
        echo "警告: 为 $image 添加新标签失败"
        continue
    fi
done < $temp_image_list

# 显示最终的镜像列表
echo -e "\n修改后的镜像列表:"
docker images | grep "^${REGISTRY_URL}/" || echo "没有找到带有 ${REGISTRY_URL} 前缀的镜像"

# 询问是否需要登录私有仓库
read -p "是否需要登录私有仓库? (y/n): " login_registry
if [ "$login_registry" = "y" ] || [ "$login_registry" = "Y" ]; then
    read -p "请输入用户名: " username
    read -sp "请输入密码: " password
    echo
    if ! echo "$password" | docker login "$REGISTRY_URL" -u "$username" --password-stdin; then
        echo "错误: 登录私有仓库失败"
        exit 1
    fi
fi

# 询问是否要推送镜像到私有仓库
read -p "是否要推送镜像到私有仓库? (y/n): " push_images
if [ "$push_images" = "y" ] || [ "$push_images" = "Y" ]; then
    echo -e "\n开始推送镜像到私有仓库..."
    while read image; do
        image_name=$(echo $image | awk -F'/' '{print $(NF-1)}')
        image_tag=$(echo $image | cut -d':' -f2)
        new_image="${REGISTRY_URL}/${image_name}:${image_tag}"
        
        echo "正在推送 $new_image ..."
        if ! docker push $new_image; then
            echo "警告: 推送 $new_image 失败"
        fi
    done < $temp_image_list
fi

echo -e "\n操作完成!"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值