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容器跟宿主机互相拷贝文件

    docker容器跟宿主机互相拷贝文件

    本文介绍了如何使用 docker cp 命令,在宿主机与 Docker 容器之间快速拷贝文件,包括从宿主机复制到容器及从容器复制到宿主机的具体操作方法
    2025-10-10
  • docker无法删除镜像报Error: No such container的错误问题

    docker无法删除镜像报Error: No such container的错误问题

    docker无法删除镜像的解决方法很简单,只需要简单三步即可完美解决docker删除镜像过程中,一直报Error: No such container的错误问题,感兴趣的朋友跟随小编一起看看吧
    2023-01-01
  • Docker Compose中配置Host网络模式的具体方法及注意事项

    Docker Compose中配置Host网络模式的具体方法及注意事项

    Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具,下面这篇文章主要介绍了Docker Compose中配置Host网络模式的具体方法及注意事项,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-09-09
  • harbor仓库搭建全过程(配置https)

    harbor仓库搭建全过程(配置https)

    需安装Docker及Docker Compose,Harbor版本需匹配,因密码加密算法升级至SHA1,需配置HTTPS以避免登录错误,步骤包括生成CA证书、修改配置、启动仓库、访问地址及数据库调整加密算法,最后设置开机自启
    2025-09-09
  • docker容器内运行jupyter映射到本地方式

    docker容器内运行jupyter映射到本地方式

    通过在容器内指定Jupyter的IP为0.0.0.0,并使用--no-browser参数,可以正确将Jupyter端口映射到本地,具体步骤包括在本地机器运行Docker容器,指定端口映射;在容器内运行Jupyter Notebook,设置--ip和--no-browser参数(一般还需--allow-root)
    2024-11-11
  • keepalived+nginx+httpd实现的双机热备+负载均衡

    keepalived+nginx+httpd实现的双机热备+负载均衡

    本文主要介绍了keepalived + nginx + httpd 实现的双机热备+负载均衡,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-07-07
  • 基于Docker部署GitLab环境搭建的方法步骤

    基于Docker部署GitLab环境搭建的方法步骤

    这篇文章主要介绍了基于Docker部署GitLab环境搭建的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Docker在Windows上安装和使用教程(加速容器应用开发)

    Docker在Windows上安装和使用教程(加速容器应用开发)

    Docker依赖Linux内核,需部署于Linux系统或虚拟环境,安装需确认架构、下载安装包、重启验证,操作流程简洁高效,本文给大家介绍Docker在Windows上安装和使用教程,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • 解决docker中mysql时间与系统时间不一致问题

    解决docker中mysql时间与系统时间不一致问题

    最近在Docker中装mysql时,发现数据库时间与系统时间相差8个小时。查询资料发现,docker的默认时区是0区,其实这会对安装的容器造成不少麻烦,比如执行日志的记录不准确等
    2021-12-12
  • 解决docker容器中出现Access denied for user 'root'@'172.17.0.2'(using password: YES)问题

    解决docker容器中出现Access denied for user &apo

    这篇文章主要介绍了解决docker容器中出现Access denied for user 'root'@'172.17.0.2'(using password: YES)问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06

最新评论