docker实现批量下载pull k8s镜像并打标签tag、推送push至镜像仓库

 更新时间:2025年05月29日 09:39:07   作者:学亮编程手记  
这篇文章主要介绍了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)、网络插件(如calicoflannel)、工具(如cert-managerdashboard)等。

目标仓库设置

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 tagdocker push

镜像标签处理逻辑

根据镜像路径的斜杠数量(count),分三种情况生成目标标签:

无斜杠(count=0

  • 镜像名直接拼接至目标仓库。
  • 示例nginx:1.19-alpine127.0.0.1:5000/kubeadm-ha/nginx:1.19-alpine

一个斜杠(count=1

  • 来自 k8s.gcr.io 的镜像:去除仓库前缀,剩余部分拼接。
  • 示例k8s.gcr.io/kube-apiserver:v1.21.14kubeadm-ha/kube-apiserver:v1.21.14
  • 其他镜像:将斜杠替换为下划线。
  • 示例calico/typha:v3.19.1kubeadm-ha/calico_typha:v3.19.1

多个斜杠(count≥2

  • 包含 coredns 的镜像:取最后一段路径。
  • 示例k8s.gcr.io/coredns/coredns:v1.8.0kubeadm-ha/coredns:v1.8.0
  • 其他镜像:去除第一个斜杠前的仓库前缀,剩余斜杠替换为下划线。
  • 示例quay.io/coreos/flannel:v0.14.0kubeadm-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/amd64linux/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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Docker运行Nacos容器自动退出问题的解决方法

    Docker运行Nacos容器自动退出问题的解决方法

    使用Docker运行Nacos容器的时候发现总是自动退出。Nacos日志里面没有明显的报错信息。查了一下是内存溢出错误,怎么处理呢,下面小编给大家介绍下Docker运行Nacos容器自动退出问题及解决方法,需要的朋友可以参考下
    2022-07-07
  • Docker daemon 无法启动: does not match with stored UUID错误解决办法

    Docker daemon 无法启动: does not match with stored UUID错误解决办法

    这篇文章主要介绍了Docker daemon 无法启动: does not match with stored UUID错误解决办法的相关资料,需要的朋友可以参考下
    2016-11-11
  • 数据卷(Data Volumes)及dockefile详解

    数据卷(Data Volumes)及dockefile详解

    在生产环境中使用Docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作,今天给大家介绍下数据卷(Data Volumes)及dockefile的相关知识,感兴趣的朋友一起看看吧
    2023-01-01
  • win7下docker安装与报错问题的解决方法

    win7下docker安装与报错问题的解决方法

    这篇文章主要为大家详细介绍了win7下docker安装与报错问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • 如何查看docker中mysql的版本问题

    如何查看docker中mysql的版本问题

    这篇文章主要介绍了如何查看docker中mysql的版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • docker images本地迁移的实现

    docker images本地迁移的实现

    这篇文章主要介绍了docker images本地迁移的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 阿里云服务器部署 Docker Swarm集群

    阿里云服务器部署 Docker Swarm集群

    这篇文章主要介绍了阿里云服务器部署 Docker Swarm集群,Docker Swarm 的作用就是用来管理Docker集群的平台,本文给大家介绍了Docker Swarm的基本概念和Docker Swarm 和 k8s的区别,需要的朋友可以参考下
    2022-07-07
  • 浅谈Docker镜像列表中的none:none是什么

    浅谈Docker镜像列表中的none:none是什么

    这篇文章主要介绍了Docker镜像列表中的none:none问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 在docker创建的mysql容器中如何执行mysql脚本

    在docker创建的mysql容器中如何执行mysql脚本

    在Docker容器中执行MySQL脚本的步骤包括进入容器、连接MySQL服务并执行脚本,如果脚本在主机上,可以直接通过命令执行,无需进入容器
    2024-11-11
  • 在Ubuntu中安装Docker和docker的使用方式

    在Ubuntu中安装Docker和docker的使用方式

    这篇文章主要介绍了在Ubuntu中安装Docker和docker的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04

最新评论