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 ]; thenecho "Login error: $login_output"echo "exit!!!"return 1fiif [ ! -f "$IMAGE_LIST_FILE" ]; thenecho "指定的鏡像列表文件 $IMAGE_LIST_FILE 不存在,請檢查文件和權限!"exit 1elif [ ! -s "$IMAGE_LIST_FILE" ]; thenecho "指定的鏡像列表文件 $IMAGE_LIST_FILE 為空,請確保文件包含有效的鏡像列表信息!"exit 1fireturn 0
}#拉取鏡像
pull_images() {echo "開始拉取鏡像!"while IFS= read -r image; doif [[ ! -z "$image" ]]; thenecho "Pulling image: $image"docker pull "$image"if [ $? != 0 ]; thenecho "拉取鏡像 $image 失敗!"fifidone < "$IMAGE_LIST_FILE"echo "鏡像拉取完成!"
}#保存鏡像
save_images() {echo "開始保存鏡像!"while IFS= read -r image; doif [[ ! -z "$image" ]]; thenlocal 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 ]; thenecho "保存鏡像 $image 失敗!"fi#docker rmi "$image"   #此處涉及有一個鏡像遍歷刪除,在保存鏡像包后刪除鏡像,如需要請自行開啟fidone < "$IMAGE_LIST_FILE"echo "鏡像保存完成!"
}#導入鏡像
load_images() {if [ -z "$(find "$SAVE_DIR" -mindepth 1 -print -quit)" ]; thenecho "鏡像存取目錄 $SAVE_DIR 中未發現鏡像文件,請檢查路徑!"exit 1filocal des_login_output=$(docker login $des_registry_host -u $des_registry_username -p $des_registry_password 2>&1)if [ $? != 0 ]; thenecho "Login error: $des_login_output"echo "exit!!!"exit 1fiecho "開始導入鏡像!"for image_file in "$SAVE_DIR"/*.tar; doif [ -f "$image_file" ]; thenecho "正在導入鏡像 $image_file"docker load -i "$image_file"if [ $? -ne 0 ]; thenecho "導入鏡像 $image_file 失敗!"fifidoneecho "所有 .tar 鏡像導入完成!"     
}#替換tag并推送到目標鏡像倉庫
tag_and_push_images() {echo "開始批量修改鏡像標簽并推送!"while IFS= read -r image; doif [ -n "$image" ]; thenimage_suffix="${image#*/}"new_image="${des_registry_host}/${image_suffix}"echo "正在為 $image 添加新標簽 $new_image"docker tag "$image" "$new_image"if [ $? -ne 0 ]; thenecho "為 $image 添加新標簽 $new_image 失敗!"continuefiecho "正在推送新鏡像 $new_image"docker push $new_imageif [ $? -ne 0 ]; thenecho "推送新鏡像 $new_image 失敗!"fidocker rmi $new_imagefidone < "$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:" choiceIFS=',' read -ra choices <<< "$choice"for choice in "${choices[@]}"; docase $choice in1)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;;esacdone
}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.pswp.cn/bicheng/71379.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71379.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71379.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

利用Java爬蟲精準獲取商品銷量詳情:實戰案例指南

在電商領域&#xff0c;商品銷量數據是衡量產品受歡迎程度和市場表現的關鍵指標。精準獲取商品銷量詳情不僅能幫助商家優化產品策略&#xff0c;還能為市場研究和數據分析提供豐富的數據資源。本文將詳細介紹如何利用Java爬蟲技術精準獲取商品銷量詳情&#xff0c;并分享關鍵技…

30 款 Windows 和 Mac 下的復制粘貼軟件對比

在日常電腦操作中&#xff0c;復制粘貼是極為高頻的操作&#xff0c;一款好用的復制粘貼軟件能極大提升工作效率。以下為你詳細介紹 30 款 Windows 和 Mac 下的復制粘貼軟件&#xff0c;并對比它們的優缺點&#xff0c;同時附上官網下載地址&#xff0c;方便大家獲取軟件。 Pa…

【Linux】Linux 文件系統——有關 inode 不足的案例

??大家好&#xff0c;我是練小杰&#xff0c;今天周二了&#xff0c;明天星期三&#xff0c;還有三天就是星期五了&#xff0c;堅持住啊各位&#xff01;&#xff01;&#xff01;&#x1f606; 本文是對之前Linux文件權限中的inode號進行實例討論&#xff0c;看到博客有錯誤…

WPF快速創建DeepSeek本地自己的客戶端-基礎思路版本

開發工具&#xff1a;VS 2015 開發環境&#xff1a;.Net 4.0 使用技術&#xff1a;WPF 本篇文章內容&#xff1a; 本地部署DeepSeek以后一般使用網頁工具&#xff08;如Chatbox&#xff09;或者DOS窗口與其對話。本篇文章使用WPF創建一個基礎版的對話工具。 一、搭建本地DeepS…

VSCode本地python包“無法解析導入”

問題現象 在使用 VSCode 編寫 Python 代碼時&#xff0c;雖然程序能正常運行&#xff0c;但遇到“無法解析導入”的問題&#xff0c;導致代碼無法高亮。 解決方法 配置 python.autoComplete.extraPaths 打開 VSCode 設置&#xff08;CtrlShiftP -> Preferences: Open Wo…

目標檢測IoU閾值全解析:YOLO/DETR模型中的精度-召回率博弈與工程實踐指南

一、技術原理與數學本質 IoU計算公式&#xff1a; IoU \frac{Area\ of\ Overlap}{Area\ of\ Union} \frac{A ∩ B}{A ∪ B}閾值選擇悖論&#xff1a; 高閾值&#xff08;0.6-0.75&#xff09;&#xff1a;減少誤檢&#xff08;FP↓&#xff09;但增加漏檢&#xff08;FN↑…

藍橋杯備考:二分算法之木材加工

P2440 木材加工 - 洛谷 這種題我們就是把答案枚舉出來&#xff0c;然后對答案進行二分&#xff0c;然后再進行判斷 比如我們這道題&#xff0c;我們枚舉切割的長度&#xff0c;然后由于切割長度越長切割段數越少 切割長度越短&#xff0c;切割段數越多的性質&#xff0c;我們…

Mongodb數據管理

Mongodb數據管理 1.登錄數據庫&#xff0c;查看默認的庫 [rootdb51~]# mongo> show databases; admin 0.000GB config 0.000GB local 0.000GB> use admin switched to db admin > show tables system.version > admin庫&#xff1a;admin 是 MongoDB 的管理…

QT基礎七、用純代碼編寫界面

終于迎來了界面開發的實戰環節&#xff01;今天我們將通過純代碼的方式&#xff0c;親手打造一個界面。如果你對 Qt 感興趣&#xff0c;歡迎訂閱我的 Qt 基礎入門專欄 &#xff08;完全免費哦&#xff09;。雖然前面幾篇文章主要是基礎知識講解&#xff0c;可能會顯得稍微平淡&…

我用AI做數據分析之數據清洗

我用AI做數據分析之數據清洗 AI與數據分析的融合效果怎樣&#xff1f; 這里描述自己在使用AI進行數據分析&#xff08;數據清洗&#xff09;過程中的幾個小故事&#xff1a; 1. 變量名的翻譯 有一個項目是某醫生自己收集的數據&#xff0c;變量名使用的是中文&#xff0c;分…

C++11 thread

文章目錄 C11 線程庫線程對象的構造方式無參的構造函數調用帶參的構造函數調用移動構造函數thread常用成員函數 this_thread命名空間join && detachmutex C11 線程庫 線程對象的構造方式 無參的構造函數 1、調用無參的構造函數,調用無參的構造函數創建出來的線程對象…

List<Map<String, Object>> 如何對某個字段求和

在Java中&#xff0c;如果你有一個List<Map<String, Object>>的結構&#xff0c;并且你想要對某個特定字段進行求和&#xff0c;你可以使用Java 8的Stream API來簡化這個過程。下面是一個示例代碼&#xff0c;演示如何對某個字段進行求和。 假設你有一個List<M…

Linux 固定 IP 地址和網關

Linux 固定 IP 地址和網關 查看 IP ifconfig ifconfig eth0 ip addr ip addr show eth0 查看網關 ip route show route -n netstat -rn 設置固定 IP // 配置靜態IP文件/etc/network/interfaces $ vi /etc/network/interfacesauto eth0 iface eth0 inet static addre…

移動通信發展史

概念解釋 第一代網絡通信 1G 第二代網絡通信 2G 第三代網絡通信 3G 第四代網絡通信 4G 4g網絡有很高的速率和很低的延時——高到500M的上傳和1G的下載 日常中的4G只是用到了4G技術 運營商 移動-從民企到國企 聯通-南方教育口有人 電信 鐵通&#xff1a;成立于 2000 年…

進階數據結構——樹狀數組

前言 看這篇文章前我建議你們先看這個視頻還有這個視頻&#xff0c;不然你們可能看不懂。 一、樹狀數組的核心思想與本質 核心思想&#xff1a;樹狀數組&#xff08;Fenwick Tree&#xff09;是一種用于高效處理前綴和查詢和單點更新的數據結構。 本質&#xff1a;通過二進…

LabVIEW無刷電機控制器檢測系統

開發了一種基于LabVIEW的無刷電機控制器檢測系統。由于無刷電機具有高效率、低能耗等優點&#xff0c;在電動領域有取代傳統電機的趨勢&#xff0c;而無刷電機的核心部件無刷電機控制器產量也在不斷增長。然而&#xff0c;無刷電機控制器的出廠檢測仍處于半自動化狀態&#xff…

STM32 CAN過濾器配置和應用方法介紹

目錄 概述 一、CAN過濾器核心概念 二、過濾器配置步驟&#xff08;以標準ID為例&#xff09; 三、不同模式的配置示例 四、高級配置技巧 五、調試與問題排查 六、關鍵計算公式 總結 概述 在STM32微控制器中&#xff0c;CAN過濾器可以配置為標識符屏蔽模式和標識符列表模…

個人系統架構技術分享

架構技術 技術版本說明CentOS7.9操作系統Amoeba負責MySQL讀寫分離NFS分布式存儲ISCSI塊存儲keepalived日志收集MySQL5.7數據庫存儲MinIO8.4.5對象存儲Kubernetes1.23.15應用容器管理平臺Redis7.0分布式緩存Elasticsearch7.17.3搜索引擎nacos3.3.4服務注冊 后端技術 技術版本…

python進階篇-面向對象

1.對象的定義 1.1 什么是對象 面向過程&#xff1a;將程序流程化 對象&#xff1a;就是“容器“&#xff0c;是用來存儲數據和功能的&#xff0c;是數據和功能的集合體。 面向對象和面向過程沒有優劣之分&#xff0c;它們只是使用的場景不同罷了。 1.2 為什么要有對象 有…

網絡安全“掛圖作戰“及其場景

文章目錄 一、網絡安全掛圖作戰來源與定義1、網絡安全掛圖作戰的來源2、網絡安全掛圖作戰的定義 二、掛圖作戰關鍵技術三、掛圖作戰與傳統態勢感知的差異四、掛圖作戰主要場景五、未來趨勢結語 一、網絡安全掛圖作戰來源與定義 1、網絡安全掛圖作戰的來源 網絡安全掛圖作戰的…