前言:脚本写成并非一蹴而就,需要不断的调式和修改,这里也是改到了7版本才在 生产环境 中验证成功。
该命令 和 脚本适用于以下场景:在某些项目中,由于特定的安全或政策要求,不允许连接到你的镜像仓库。然而,项目团队仍需获取特定命名空间下的部分 或者 所有 Docker 镜像。此命令和脚本能够协助您在本地环境拉取并保存所需命名空间中的镜像,以便安全地提供给项目团队,满足他们的部署和测试需求,同时确保遵守相关的安全规定和访问限制。
一、命令获取指定pod镜像
命令-查询镜像版本号:
kubectl get pods -n <namespace> -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{range .spec.containers[*]}{.image}{"\n"}{end}{end}' | grep -E "(<pod-name1>|<pod-name2>|<pod-name3>|<pod-name......>)"
执行结果:
命令-save:
docker save -o namespace_images.tar <pod-name1结果......727> <pod-name2结果......21164728> <pod-name3结果......build_20241021181731> <pod-name......结果>
执行结果:
最后会生成一个tar包
二、自动化脚本获取指定命名空间下全量pod镜像
脚本内容:
#!/bin/bash
# 提示用户输入命名空间
echo -e "请输入命名空间:"
read -e NAMESPACE
# 获取当前脚本的绝对路径
SCRIPT_DIR=$(cd $(dirname $0) && pwd)
# 定义输出文件名,格式为 <命名空间>_images_<日期>.tar
OUTPUT_FILE="${NAMESPACE}_images_$(date +%Y%m%d).tar"
# 获取该命名空间下的所有 Pod 的名称和镜像
POD_NAMES=$(kubectl get pods -n $NAMESPACE -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}')
IMAGES=$(kubectl get pods -n $NAMESPACE -o jsonpath='{range .items[*]}{range .spec.containers[*]}{.image}{"\n"}{end}{end}' | sort | uniq)
# 拼接所有镜像名称成一个字符串
IMAGE_STRING=""
for IMAGE in $IMAGES; do
IMAGE_STRING+="$IMAGE "
done
# 拉取所有镜像
echo "正在拉取所有镜像..."
for IMAGE in $IMAGES; do
docker pull $IMAGE
done
# 保存所有镜像到一个文件
echo "正在将所有镜像保存到单个 tar 文件:$OUTPUT_FILE"
docker save $IMAGE_STRING -o $SCRIPT_DIR/$OUTPUT_FILE
echo "所有镜像已处理并保存到 $SCRIPT_DIR/$OUTPUT_FILE"
脚本执行后,等待执行结束会生成一个以 命名空间 和 当前日期 的tar包
以下是脚本的详细解析:
-
获取指定命名空间下所有 Pod 的镜像列表,并去重:
IMAGES=$(kubectl get pods -n $NAMESPACE -o jsonpath='{range .items[*]}{range .spec.containers[*]}{.image}{"\n"}{end}{end}' | sort | uniq)
这行代码使用
kubectl
命令获取指定命名空间下所有 Pod 的镜像列表。jsonpath
参数用于提取镜像名称,然后通过管道传递给sort
和uniq
命令,以确保列表中的镜像名称是唯一的(去重)。 -
将所有镜像名称拼接成一个字符串:
IMAGE_STRING="" for IMAGE in $IMAGES; do IMAGE_STRING+="$IMAGE " done
这个循环遍历去重后的镜像列表
IMAGES
,并将每个镜像名称添加到IMAGE_STRING
变量中,镜像名称之间用空格分隔。 -
定义输出文件名,格式为 KaTeX parse error: Expected group after '_' at position 19: …MESPACE}_images_̲(date +%Y%m%d).tar:
OUTPUT_FILE="${NAMESPACE}_images_$(date +%Y%m%d).tar"
这行代码定义了输出文件的名称,格式为
${NAMESPACE}_images_<日期>.tar
,其中<日期>
由date +%Y%m%d
命令生成,表示当前日期的年月日。 -
拉取所有镜像:
for IMAGE in $IMAGES; do docker pull $IMAGE done
这个循环遍历去重后的镜像列表
IMAGES
,并对每个镜像执行docker pull
命令,以确保本地有这些镜像的最新版本。 -
使用 docker save 命令将所有镜像保存到一个 tar 文件中:
docker save $IMAGE_STRING -o $SCRIPT_DIR/$OUTPUT_FILE
这行代码使用
docker save
命令将所有镜像(由IMAGE_STRING
变量指定)保存到一个 tar 文件中。-o
参数指定输出文件的路径和名称,该路径是脚本所在目录下的$OUTPUT_FILE
。 -
输出保存完成的消息:
echo "All images have been processed and saved to $SCRIPT_DIR/$OUTPUT_FILE"
这行代码输出一条消息,通知用户所有镜像已经被处理并保存到了指定的文件路径。