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

docker批量pull/save/load/tag/push镜像shell脚本

目录

注意:

脚本内容

执行效果


注意:

  • 以下脚本为shell脚本通过docker/nerdctl进行镜像独立打包镜像的相关操作
  • 脚本内仓库信息和镜像存取路径需自行更改
  • 需自行创建images.txt并填写值,并且与脚本位于同级目录下
    [root@master01 sulibao]# ll
    -rw-r--r-- 1 root root 3621 Feb 17 15:32 images_pull_save_load_tag_push.sh
    -rw-r--r-- 1 root root  906 Feb 17 15:11 images.txt
  • 该脚本读入单个选项和多个选项,多个选项以英文模式","相隔
  • 该脚本不关系定时任务,使用交互显示输出信息,需要保留日志可自行添加定向

脚本内容

#!/bin/bash

#定义原镜像仓库地址、login用户、login密码
registry_host="xxx"
registry_username="xxx"
registry_password="xxx"

#定义镜像列表文件,此文件应和脚本位于同级目录下
IMAGE_LIST_FILE="images.txt"

#定义镜像存取目录
SAVE_DIR=/data/sulibao/images_$(date +"%Y-%m-%d")

#定义push的镜像仓库地址、login用户、login密码
des_registry_host="192.168.2.190:5000"
des_registry_username="xxx"
des_registry_password="xxx"

#环境准备,登录原镜像仓库,确认镜像列表文件存在
prepare_environment() {
    mkdir -p "$SAVE_DIR"
    local login_output=$(docker login "$registry_host" -u "$registry_username" -p "$registry_password" 2>&1)
    if [ $? != 0 ]; then
        echo "Login error: $login_output"
        echo "exit!!!"
        return 1
    fi
    if [ ! -f "$IMAGE_LIST_FILE" ]; then
        echo "指定的镜像列表文件 $IMAGE_LIST_FILE 不存在,请检查文件和权限!"
        exit 1
    elif [ ! -s "$IMAGE_LIST_FILE" ]; then
        echo "指定的镜像列表文件 $IMAGE_LIST_FILE 为空,请确保文件包含有效的镜像列表信息!"
        exit 1
    fi
    return 0
}

#拉取镜像
pull_images() {
    echo "开始拉取镜像!"
    while IFS= read -r image; do
        if [[ ! -z "$image" ]]; then
            echo "Pulling image: $image"
            docker pull "$image"
            if [ $? != 0 ]; then
                echo "拉取镜像 $image 失败!"
            fi
        fi
    done < "$IMAGE_LIST_FILE"
    echo "镜像拉取完成!"
}

#保存镜像
save_images() {
    echo "开始保存镜像!"
    while IFS= read -r image; do
        if [[ ! -z "$image" ]]; then
            local image_file=$(echo "$image" | tr '/:' '_')
            echo "Saving image: $image to $SAVE_DIR/$image_file.tar"
            docker save -o "$SAVE_DIR/$image_file.tar" "$image"
            if [ $? != 0 ]; then
                echo "保存镜像 $image 失败!"
            fi
            #docker rmi "$image"   #此处涉及有一个镜像遍历删除,在保存镜像包后删除镜像,如需要请自行开启
        fi
    done < "$IMAGE_LIST_FILE"
    echo "镜像保存完成!"
}

#导入镜像
load_images() {
    if [ -z "$(find "$SAVE_DIR" -mindepth 1 -print -quit)" ]; then
        echo "镜像存取目录 $SAVE_DIR 中未发现镜像文件,请检查路径!"
        exit 1
    fi
    local des_login_output=$(docker login $des_registry_host -u $des_registry_username -p $des_registry_password 2>&1)
    if [ $? != 0 ]; then
        echo "Login error: $des_login_output"
        echo "exit!!!"
        exit 1
    fi
    echo "开始导入镜像!"
    for image_file in "$SAVE_DIR"/*.tar; do
      if [ -f "$image_file" ]; then
          echo "正在导入镜像 $image_file"
          docker load -i "$image_file"
          if [ $? -ne 0 ]; then
              echo "导入镜像 $image_file 失败!"
          fi
      fi
    done
    echo "所有 .tar 镜像导入完成!"     
}

#替换tag并推送到目标镜像仓库
tag_and_push_images() {
    echo "开始批量修改镜像标签并推送!"
    while IFS= read -r image; do
      if [ -n "$image" ]; then
          image_suffix="${image#*/}"
          new_image="${des_registry_host}/${image_suffix}"
          echo "正在为 $image 添加新标签 $new_image"
          docker tag "$image" "$new_image"
          if [ $? -ne 0 ]; then
              echo "为 $image 添加新标签 $new_image 失败!"
              continue
          fi

          echo "正在推送新镜像 $new_image"
          docker push $new_image
          if [ $? -ne 0 ]; then
              echo "推送新镜像 $new_image 失败!"
          fi
          docker rmi $new_image
      fi
    done < "$IMAGE_LIST_FILE"
}

#操作选项
show_menu() {
    echo "Select the action you want to perform:"
    echo "1.Pull images."
    echo "2.Save images to $SAVE_DIR"
    echo "3.Load images from $SAVE_DIR"
    echo "4.Replace tag for images and push to target registry"
    echo "5.Exit."
    read -p "Please enter the operation number:" choice
    IFS=',' read -ra choices <<< "$choice"
    for choice in "${choices[@]}"; do
        case $choice in
            1)
                pull_images
                ;;
            2)
                save_images 
                ;;
            3)
                load_images
                ;;
            4)
                tag_and_push_images
                ;;
            5)  
                echo "You have exited the program."
                exit 0
                ;; 
            *)
                echo "Invalid input, please enter option number."
                show_menu
                ;;
        esac
    done
}

prepare_environment
show_menu

执行效果

  • 完整执行过程
[root@master01 sulibao]# bash images_pull_save_load_tag_push.sh 
Select the action you want to perform:
1.Pull images.
2.Save images to /data/sulibao/images_2025-02-17
3.Load images from /data/sulibao/images_2025-02-17
4.Replace tag for images and push to target registry
5.Exit.
Please enter the operation number:1,2,3,4

开始拉取镜像!
Pulling image: xxx/nginx:1.26.3
1.26.3: Pulling from xxx/nginx
Digest: sha256:52892d0d4f284526aa1d72ac42fd194c3e887580f60080ded2686d49037c6941
Status: Image is up to date for xxx/nginx:1.26.3
xxx/nginx:1.26.3
......
镜像拉取完成!

开始保存镜像!
Saving image: xxx/nginx:1.26.3 to /data/sulibao/images_2025-02-17/xxx_nginx_1.26.3.tar
......
镜像保存完成!

开始导入镜像!
正在导入镜像 /data/sulibao/images_2025-02-17/xxx_nginx_1.26.3.tar
Loaded image: xxx/nginx:1.26.3
......
所有 .tar 镜像导入完成!

开始批量修改镜像标签并推送!
正在为 xxx/nginx:1.26.3 添加新标签 192.168.2.190:5000/su03/nginx:1.26.3
正在推送新镜像 192.168.2.190:5000/su03/nginx:1.26.3
The push refers to repository [192.168.2.190:5000/su03/nginx]
d9c572c95560: Layer already exists 
8190a7b44dae: Layer already exists 
a676f50129b7: Layer already exists 
867f455c499d: Layer already exists 
043f2436492e: Layer already exists 
263be8d15880: Layer already exists 
7914c8f600f5: Layer already exists 
1.26.3: digest: sha256:ed94607a3100cd7274aa915678f8e6d1effba2919198044654000383d77035ac size: 1778
Untagged: 192.168.2.190:5000/su03/nginx:1.26.3
Untagged: 192.168.2.190:5000/su03/nginx@sha256:ed94607a3100cd7274aa915678f8e6d1effba2919198044654000383d77035ac

[root@master01 sulibao]# ll images_2025-02-17/
total 1290584
-rw------- 1 root root 781347328 Feb 17 16:35 xxx_mysql_8.0.41.tar
-rw------- 1 root root 196080128 Feb 17 16:35 xxx_nginx_1.26.3.tar
-rw------- 1 root root 344122368 Feb 17 16:35 xxx_postgresql_13.16.0.tar
  • 若镜像列表文件不存在或为空
[root@master01 sulibao]# bash images_pull_save_load_tag_push.sh 
指定的镜像列表文件 images.txt 不存在,请检查文件和权限!

[root@master01 sulibao]# bash images_pull_save_load_tag_push.sh 
指定的镜像列表文件 images.txt 为空,请确保文件包含有效的镜像列表信息!
  • 仅仅需要执行load_image时,请确保镜像存取目录中存在有你需要的镜像包。无论是你手动存放的包还是通过脚本pull_and_save的包,需要以".tar"为后缀,若后缀不同,请自行修改脚本。
[root@master01 sulibao]# bash images_pull_save_load_tag_push.sh 
Select the action you want to perform:
1.Pull images.
2.Save images to /data/sulibao/images_2025-02-17
3.Load images from /data/sulibao/images_2025-02-17
4.Replace tag for images and push to target registry
5.Exit.
Please enter the operation number:3
镜像存取目录 /data/sulibao/images_2025-02-17 中未发现镜像文件,请检查路径!


[root@master01 sulibao]# ll    #此时仅有prepare_environment函数创建的镜像存取目录,实际上无数据,执行失败的
-rw-r--r-- 1 root root 4695 Feb 17 16:45 images_pull_save_load_tag_push.sh
-rw-r--r-- 1 root root  159 Feb 17 16:53 images.txt
drwxr-xr-x 2 root root    6 Feb 17 16:54 images_2025-02-17

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

相关文章:

  • 【Unity URP】PBR框架下的NPR 角色渲染 以《少女前线2:追放》为例
  • MongoDB索引介绍
  • Visual Studio Code使用ai大模型编成
  • 关于视频去水印的一点尝试
  • [250217] x-cmd 发布 v0.5.3:新增 DeepSeek AI 模型支持及飞书/钉钉群机器人 Webhook 管理
  • centos部署open-webui
  • OpenCV图像基本操作
  • github上文件过大无法推送问题
  • 解压rar格式的软件有哪些?8种方法(Win/Mac/手机/网页端)
  • 华为昇腾 910B 部署 DeepSeek-R1 蒸馏系列模型详细指南
  • gradio创建openai前端对接deepseek等模型流式输出markdown格式文本
  • Windows 图形显示驱动开发-CPU 内存调节和64KB 页面支持
  • 力扣每日一题【算法学习day.127】
  • Python——寻找矩阵的【鞍点】(教师:恒风)
  • 接口测试及常用接口测试工具(Postman/Jmeter)
  • Linux学习笔记之虚拟地址空间
  • 【Linux】--- 信号阻塞、信号捕捉
  • TransCNN模型详解
  • JUC并发二
  • 健康的生活方式小结---秋浦四郎