docker实现批量下载pull k8s镜像并打标签tag、推送push至镜像仓库
作者:学亮编程手记
这篇文章主要介绍了docker实现批量下载pull k8s镜像并打标签tag、推送push至镜像仓库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
docker批量下载pull k8s镜像并打标签tag、推送push至镜像仓库
#!/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
这个Bash脚本的主要功能是从公共镜像仓库拉取多个Kubernetes相关镜像,重新打标签后推送到本地或私有的Docker镜像仓库。
以下是详细解释:
脚本结构解析
Shebang与调试选项
#!/bin/bash # set -eux;
#!/bin/bash
:指定使用Bash解释器。set -eux
(注释状态):若启用,会开启严格模式(报错退出)、打印变量展开和命令执行日志,用于调试。
镜像列表
images=" nginx:1.19-alpine haproxy:2.3-alpine ... k8s.gcr.io/ingress-nginx/controller:v0.47.0 "
- 定义了一系列镜像地址,涵盖Kubernetes核心组件(如
kube-apiserver
)、网络插件(如calico
、flannel
)、工具(如cert-manager
、dashboard
)等。
目标仓库设置
dest_registry=${dest_registry:-'127.0.0.1:5000/kubeadm-ha'}
- 目标镜像仓库地址,默认为本地仓库
127.0.0.1:5000/kubeadm-ha
,可通过环境变量dest_registry
覆盖。
主循环处理镜像
for image in $images ; do docker pull --platform ${1:-'linux/amd64'} $image ... done
遍历所有镜像,执行以下操作:
- 拉取镜像:
docker pull --platform
指定平台(默认为linux/amd64
)。 - 计算路径层级:通过斜杠数量(
count
)判断镜像路径结构。 - 生成目标标签:根据路径结构调整镜像名称,适应目标仓库格式。
- 重新打标签并推送:
docker tag
和docker push
。
镜像标签处理逻辑
根据镜像路径的斜杠数量(count
),分三种情况生成目标标签:
无斜杠(count=0
)
- 镜像名直接拼接至目标仓库。
- 示例:
nginx:1.19-alpine
→127.0.0.1:5000/kubeadm-ha/nginx:1.19-alpine
一个斜杠(count=1
)
- 来自
k8s.gcr.io
的镜像:去除仓库前缀,剩余部分拼接。 - 示例:
k8s.gcr.io/kube-apiserver:v1.21.14
→kubeadm-ha/kube-apiserver:v1.21.14
- 其他镜像:将斜杠替换为下划线。
- 示例:
calico/typha:v3.19.1
→kubeadm-ha/calico_typha:v3.19.1
多个斜杠(count≥2
)
- 包含
coredns
的镜像:取最后一段路径。 - 示例:
k8s.gcr.io/coredns/coredns:v1.8.0
→kubeadm-ha/coredns:v1.8.0
- 其他镜像:去除第一个斜杠前的仓库前缀,剩余斜杠替换为下划线。
- 示例:
quay.io/coreos/flannel:v0.14.0
→kubeadm-ha/coreos_flannel:v0.14.0
关键命令说明
拉取镜像
docker pull --platform ${1:-'linux/amd64'} $image
--platform
:指定镜像架构(如linux/arm64
),需镜像支持多平台。
处理标签逻辑
docker tag $image $dest docker push $dest
- 根据生成的
$dest
标签推送镜像到目标仓库。
使用场景
- 离线环境部署:在内网中搭建私有镜像仓库,预先拉取并推送所有依赖镜像。
- 统一镜像来源:将分散在多个仓库的镜像集中管理,避免依赖外部网络。
- 解决拉取限制:规避从
k8s.gcr.io
等仓库拉取镜像的网络问题。
注意事项
Sed命令潜在问题
- 脚本中
sed 's / _ g'
应为sed 's/\//_/g'
,否则无法正确替换斜杠。
镜像多平台支持
- 需确保目标镜像支持指定的平台(如
linux/amd64
或linux/arm64
)。
本地仓库配置
- 需提前部署Docker Registry服务(如
docker run -d -p 5000:5000 --name registry registry:2
)。
示例执行
假设目标仓库为 192.168.1.100:5000/myrepo
,执行命令:
dest_registry=192.168.1.100:5000/myrepo ./script.sh linux/amd64
所有镜像将被拉取、重新打标签,并推送至 192.168.1.100:5000/myrepo
。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。