内网环境批量拉取、上传镜像的脚本
在工作中会遇到系统部署在完全隔离的内网环境中,而开发或者产品镜像又是在外网环境中的情况,当进行环境部署或者镜像更新时就比较繁琐。
脚本执行示意:
1.拉取镜像脚本
(1)使用方法
-
下载脚本,将脚本上传至能够连接外网的Linux主机上,可以是便宜的腾讯云服务器,可以是本地电脑装的Linux虚拟机。
-
编辑images.txt文件,填入你要拉取的镜像的名字和版本,注意是只有镜像名称和版本,不要填写仓库地址。
-
执行以下命令启动批量拉取保存脚本
sudo chmod -R 777 * ./pull_images.sh -
根据提示输入外网的镜像仓库地址,例如阿里云的。脚本将会从输入的仓库地址依次拉取images.txt中填写的多个镜像。
-
等待脚本执行完成
-
查看,目录下会多出一个images.tar.gz压缩包,这个压缩包内就是images.txt中的一个或多个镜像。
(2)pull_images.sh
#!/bin/bash
G=`tput setaf 2`
C=`tput setaf 6`
Y=`tput setaf 3`
Q=`tput sgr0`
echo -e "${C}\n\n镜像下载脚本:${Q}"
echo -e "${C}pull_images.sh将读取images.txt中的镜像,拉取并保存到images.tar.gz中\n\n${Q}"
# 获取外网镜像仓库地址,默认为阿里云
read -p "${C}输入镜像仓库地址(默认registry.cn-hangzhou.aliyuncs.com/ecf/):${Q}" aliNexus
if [ -z "${aliNexus}" ];then
aliNexus="registry.cn-hangzhou.aliyuncs.com/ecf/"
fi
if [[ ${aliNexus} =~ /$ ]];
then echo
else aliNexus="${aliNexus}/"
fi
# 清理本地已有镜像
echo "${C}start: 清理镜像${Q}"
for rm_image in $(cat images.txt)
do
docker rmi $aliNexus$rm_image
done
echo -e "${C}end: 清理完成\n\n${Q}"
# 创建文件夹
mkdir images
rm -rf images/*
rm -rf images.tar.gz
# pull、save镜像
echo "${C}start: 拉取保存镜像${Q}"
for pull_image in $(cat images.txt)
do
echo "${Y} 开始拉取$pull_image...${Q}"
fileName=${pull_image//:/__}
docker pull $aliNexus$pull_image
docker save $aliNexus$pull_image | gzip -c > ./images/$fileName.tar.gz
done
echo -e "${C}end: 保存完成\n\n${Q}"
# 打包镜像
echo "${C}start: 打包镜像${Q}"
tar -czvf images.tar.gz images
rm -rf images
echo -e "${C}end: 打包完成\n\n${Q}"
# 清理镜像
read -p "${C}是否清理本地镜像(Y/N,默认N)?:${Q}" is_clean
if [ -z "${is_clean}" ];then
is_clean="N"
fi
if [ "${is_clean}" == "Y" ];then
for clean_image in $(cat images.txt)
do
docker rmi $aliNexus$clean_image
done
echo -e "${C}清理结束~\n\n${Q}"
fi
echo -e "${C}执行结束~\n\n${Q}"
2.上传镜像脚本
(1)使用方法
-
将上面拉取到的images.tar.gz压缩包、images.txt、push_images.sh脚本复制到内网中能够连接到内网镜像仓库的Linux主机上。
-
执行以下命令启动批量上传脚本
sudo chmod -R 777 * ./push_images.sh -
根据提示输入内网的镜像仓库地址、外网的镜像仓库地址。脚本将会解压并加载images.tar.gz压缩包中的镜像,并重命名成内网的镜像,最后推送镜像。
-
等待脚本执行完成,最后会打印出内网的镜像的完整的名字,可以直接复制这里打印的名字去进行镜像部署或更新即可。

(2)push_images.sh
#!/bin/bash
G=`tput setaf 2`
C=`tput setaf 6`
Y=`tput setaf 3`
Q=`tput sgr0`
echo -e "${C}\n\n镜像上传脚本:${Q}"
echo -e "${C}push_images.sh将读取images.txt中的镜像名称,将images.tar.gz中的镜像推送到内网镜像仓库\n\n${Q}"
# 获取内网镜像仓库地址
read -p "${C}内网镜像仓库地址(默认30.23.12.172:5001/hcf):${Q}" nexusAddr
if [ -z "${nexusAddr}" ];then
nexusAddr="30.23.12.172:5001/hcf/"
fi
if [[ ${nexusAddr} =~ /$ ]];
then echo
else nexusAddr="${nexusAddr}/"
fi
# 获取外网镜像仓库地址,用于清理镜像
read -p "${C}外网镜像仓库地址(默认registry.cn-hangzhou.aliyuncs.com/ecf/):${Q}" aliNexus
if [ -z "${aliNexus}" ];then
aliNexus="registry.cn-hangzhou.aliyuncs.com/ecf/"
fi
if [[ ${aliNexus} =~ /$ ]];
then echo
else aliNexus="${aliNexus}/"
fi
# 清理本地已有镜像
echo "${C}start: 清理镜像${Q}"
for rm_image in $(cat images.txt)
do
docker rmi $aliNexus$rm_image
docker rmi $nexusAddr$rm_image
done
echo -e "${C}end: 清理完成\n\n${Q}"
# 解压文件夹
echo "${C}start: 解压镜像包${Q}"
rm -rf images
tar -zxvf images.tar.gz
echo -e "${C}end: 解压完成\n\n${Q}"
# tag、push镜像
echo "${C}start: 推送镜像${Q}"
for push_image in $(cat images.txt)
do
echo -e "${Y} 开始推送$push_image...${Q}"
fileName=${push_image//:/__}
docker load --input ./images/$fileName.tar.gz
docker tag $aliNexus$push_image $nexusAddr$push_image
docker push $nexusAddr$push_image
done
echo -e "${C}end: 推送完成\n\n${Q}"
echo -e "${Y} 内网镜像地址:${Q}"
for image in $(cat images.txt)
do
echo -e "${Y} $nexusAddr$image${Q}"
done
# 清理镜像
read -p "${C}是否清理本地镜像(Y/N,默认N)?:${Q}" is_clean
if [ -z "${is_clean}" ];then
is_clean="N"
fi
if [ "${is_clean}" == "Y" ];then
for clean_image in $(cat images.txt)
do
docker rmi $nexusAddr$clean_image
docker rmi $aliNexus$clean_image
done
echo -e "${C}清理结束~\n\n${Q}"
fi
echo -e "${C}执行结束~\n\n${Q}"