docker實(shí)現(xiàn)批量下載pull?k8s鏡像并打標(biāo)簽tag、推送push至鏡像倉(cāng)庫(kù)
docker批量下載pull k8s鏡像并打標(biāo)簽tag、推送push至鏡像倉(cāng)庫(kù)
#!/bin/bash # set -eux; images=" nginx:1.19-alpine haproxy:2.3-alpine traefik:2.4.8 openresty/openresty:1.19.3.1-alpine envoyproxy/envoy:v1.16.2 osixia/keepalived:2.0.20 setzero/chrony:3.5 calico/typha:v3.19.1 calico/cni:v3.19.1 calico/node:v3.19.1 calico/kube-controllers:v3.19.1 calico/pod2daemon-flexvol:v3.19.1 calico/ctl:v3.19.1 jettech/kube-webhook-certgen:v1.5.1 kubernetesui/dashboard:v2.3.1 kubernetesui/metrics-scraper:v1.0.6 quay.io/coreos/flannel:v0.14.0 quay.io/jetstack/cert-manager-cainjector:v1.4.0 quay.io/jetstack/cert-manager-webhook:v1.4.0 quay.io/jetstack/cert-manager-controller:v1.4.0 k8s.gcr.io/kube-apiserver:v1.21.14 k8s.gcr.io/kube-controller-manager:v1.21.14 k8s.gcr.io/kube-scheduler:v1.21.14 k8s.gcr.io/kube-proxy:v1.21.14 k8s.gcr.io/pause:3.4.1 k8s.gcr.io/etcd:3.5.4-0 k8s.gcr.io/coredns/coredns:v1.8.0 k8s.gcr.io/ingress-nginx/controller:v0.47.0 k8s.gcr.io/metrics-server/metrics-server:v0.5.0 " dest_registry=${dest_registry:-'127.0.0.1:5000/kubeadm-ha'} for image in $images ; do docker pull --platform ${1:-'linux/amd64'} $image count=$(echo $image | grep -o '/*' | wc -l) if [[ $count -eq 0 ]]; then dest=$dest_registry/$image elif [[ $count -eq 1 ]]; then if [[ $image =~ 'k8s.gcr.io' ]]; then dest=$dest_registry/$(echo ${image#*/} | sed 's / _ g') else dest=$dest_registry/$(echo ${image} | sed 's / _ g') fi else if [[ $image =~ 'coredns' ]]; then dest=$dest_registry/$(echo ${image##*/} | sed 's / _ g') else dest=$dest_registry/$(echo ${image#*/} | sed 's / _ g') fi fi docker tag $image $dest docker push $dest done
這個(gè)Bash腳本的主要功能是從公共鏡像倉(cāng)庫(kù)拉取多個(gè)Kubernetes相關(guān)鏡像,重新打標(biāo)簽后推送到本地或私有的Docker鏡像倉(cāng)庫(kù)。
以下是詳細(xì)解釋?zhuān)?/p>
腳本結(jié)構(gòu)解析
Shebang與調(diào)試選項(xiàng)
#!/bin/bash # set -eux;
#!/bin/bash
:指定使用Bash解釋器。set -eux
(注釋狀態(tài)):若啟用,會(huì)開(kāi)啟嚴(yán)格模式(報(bào)錯(cuò)退出)、打印變量展開(kāi)和命令執(zhí)行日志,用于調(diào)試。
鏡像列表
images=" nginx:1.19-alpine haproxy:2.3-alpine ... k8s.gcr.io/ingress-nginx/controller:v0.47.0 "
- 定義了一系列鏡像地址,涵蓋Kubernetes核心組件(如
kube-apiserver
)、網(wǎng)絡(luò)插件(如calico
、flannel
)、工具(如cert-manager
、dashboard
)等。
目標(biāo)倉(cāng)庫(kù)設(shè)置
dest_registry=${dest_registry:-'127.0.0.1:5000/kubeadm-ha'}
- 目標(biāo)鏡像倉(cāng)庫(kù)地址,默認(rèn)為本地倉(cāng)庫(kù)
127.0.0.1:5000/kubeadm-ha
,可通過(guò)環(huán)境變量dest_registry
覆蓋。
主循環(huán)處理鏡像
for image in $images ; do docker pull --platform ${1:-'linux/amd64'} $image ... done
遍歷所有鏡像,執(zhí)行以下操作:
- 拉取鏡像:
docker pull --platform
指定平臺(tái)(默認(rèn)為linux/amd64
)。 - 計(jì)算路徑層級(jí):通過(guò)斜杠數(shù)量(
count
)判斷鏡像路徑結(jié)構(gòu)。 - 生成目標(biāo)標(biāo)簽:根據(jù)路徑結(jié)構(gòu)調(diào)整鏡像名稱(chēng),適應(yīng)目標(biāo)倉(cāng)庫(kù)格式。
- 重新打標(biāo)簽并推送:
docker tag
和docker push
。
鏡像標(biāo)簽處理邏輯
根據(jù)鏡像路徑的斜杠數(shù)量(count
),分三種情況生成目標(biāo)標(biāo)簽:
無(wú)斜杠(count=0
)
- 鏡像名直接拼接至目標(biāo)倉(cāng)庫(kù)。
- 示例:
nginx:1.19-alpine
→127.0.0.1:5000/kubeadm-ha/nginx:1.19-alpine
一個(gè)斜杠(count=1
)
- 來(lái)自
k8s.gcr.io
的鏡像:去除倉(cāng)庫(kù)前綴,剩余部分拼接。 - 示例:
k8s.gcr.io/kube-apiserver:v1.21.14
→kubeadm-ha/kube-apiserver:v1.21.14
- 其他鏡像:將斜杠替換為下劃線(xiàn)。
- 示例:
calico/typha:v3.19.1
→kubeadm-ha/calico_typha:v3.19.1
多個(gè)斜杠(count≥2
)
- 包含
coredns
的鏡像:取最后一段路徑。 - 示例:
k8s.gcr.io/coredns/coredns:v1.8.0
→kubeadm-ha/coredns:v1.8.0
- 其他鏡像:去除第一個(gè)斜杠前的倉(cāng)庫(kù)前綴,剩余斜杠替換為下劃線(xiàn)。
- 示例:
quay.io/coreos/flannel:v0.14.0
→kubeadm-ha/coreos_flannel:v0.14.0
關(guān)鍵命令說(shuō)明
拉取鏡像
docker pull --platform ${1:-'linux/amd64'} $image
--platform
:指定鏡像架構(gòu)(如linux/arm64
),需鏡像支持多平臺(tái)。
處理標(biāo)簽邏輯
docker tag $image $dest docker push $dest
- 根據(jù)生成的
$dest
標(biāo)簽推送鏡像到目標(biāo)倉(cāng)庫(kù)。
使用場(chǎng)景
- 離線(xiàn)環(huán)境部署:在內(nèi)網(wǎng)中搭建私有鏡像倉(cāng)庫(kù),預(yù)先拉取并推送所有依賴(lài)鏡像。
- 統(tǒng)一鏡像來(lái)源:將分散在多個(gè)倉(cāng)庫(kù)的鏡像集中管理,避免依賴(lài)外部網(wǎng)絡(luò)。
- 解決拉取限制:規(guī)避從
k8s.gcr.io
等倉(cāng)庫(kù)拉取鏡像的網(wǎng)絡(luò)問(wèn)題。
注意事項(xiàng)
Sed命令潛在問(wèn)題
- 腳本中
sed 's / _ g'
應(yīng)為sed 's/\//_/g'
,否則無(wú)法正確替換斜杠。
鏡像多平臺(tái)支持
- 需確保目標(biāo)鏡像支持指定的平臺(tái)(如
linux/amd64
或linux/arm64
)。
本地倉(cāng)庫(kù)配置
- 需提前部署Docker Registry服務(wù)(如
docker run -d -p 5000:5000 --name registry registry:2
)。
示例執(zhí)行
假設(shè)目標(biāo)倉(cāng)庫(kù)為 192.168.1.100:5000/myrepo
,執(zhí)行命令:
dest_registry=192.168.1.100:5000/myrepo ./script.sh linux/amd64
所有鏡像將被拉取、重新打標(biāo)簽,并推送至 192.168.1.100:5000/myrepo
。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker運(yùn)行Nacos容器自動(dòng)退出問(wèn)題的解決方法
使用Docker運(yùn)行Nacos容器的時(shí)候發(fā)現(xiàn)總是自動(dòng)退出。Nacos日志里面沒(méi)有明顯的報(bào)錯(cuò)信息。查了一下是內(nèi)存溢出錯(cuò)誤,怎么處理呢,下面小編給大家介紹下Docker運(yùn)行Nacos容器自動(dòng)退出問(wèn)題及解決方法,需要的朋友可以參考下2022-07-07Docker daemon 無(wú)法啟動(dòng): does not match with stored UUID錯(cuò)誤解決辦法
這篇文章主要介紹了Docker daemon 無(wú)法啟動(dòng): does not match with stored UUID錯(cuò)誤解決辦法的相關(guān)資料,需要的朋友可以參考下2016-11-11數(shù)據(jù)卷(Data Volumes)及dockefile詳解
在生產(chǎn)環(huán)境中使用Docker,往往需要對(duì)數(shù)據(jù)進(jìn)行持久化,或者需要在多個(gè)容器之間進(jìn)行數(shù)據(jù)共享,這必然涉及容器的數(shù)據(jù)管理操作,今天給大家介紹下數(shù)據(jù)卷(Data Volumes)及dockefile的相關(guān)知識(shí),感興趣的朋友一起看看吧2023-01-01win7下docker安裝與報(bào)錯(cuò)問(wèn)題的解決方法
這篇文章主要為大家詳細(xì)介紹了win7下docker安裝與報(bào)錯(cuò)問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06docker images本地遷移的實(shí)現(xiàn)
這篇文章主要介紹了docker images本地遷移的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03在docker創(chuàng)建的mysql容器中如何執(zhí)行mysql腳本
在Docker容器中執(zhí)行MySQL腳本的步驟包括進(jìn)入容器、連接MySQL服務(wù)并執(zhí)行腳本,如果腳本在主機(jī)上,可以直接通過(guò)命令執(zhí)行,無(wú)需進(jìn)入容器2024-11-11