docker批量pull/save/load/tag/push镜像shell脚本
- 手机
- 2025-09-03 21:48:02

目录
注意:
脚本内容
执行效果
注意: 以下脚本为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
docker批量pull/save/load/tag/push镜像shell脚本由讯客互联手机栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“docker批量pull/save/load/tag/push镜像shell脚本”