内网环境批量拉取、上传Docker镜像的脚本

内网环境批量拉取、上传镜像的脚本

在工作中会遇到系统部署在完全隔离的内网环境中,而开发或者产品镜像又是在外网环境中的情况,当进行环境部署或者镜像更新时就比较繁琐。

脚本执行示意:
内网环境批量拉取、上传Docker镜像的脚本_第1张图片

1.拉取镜像脚本

(1)使用方法

  • 下载脚本,将脚本上传至能够连接外网的Linux主机上,可以是便宜的腾讯云服务器,可以是本地电脑装的Linux虚拟机。
    内网环境批量拉取、上传Docker镜像的脚本_第2张图片
  • 编辑images.txt文件,填入你要拉取的镜像的名字和版本,注意是只有镜像名称和版本,不要填写仓库地址。
    内网环境批量拉取、上传Docker镜像的脚本_第3张图片
  • 执行以下命令启动批量拉取保存脚本
    sudo chmod -R 777 *
    ./pull_images.sh
    
  • 根据提示输入外网的镜像仓库地址,例如阿里云的。脚本将会从输入的仓库地址依次拉取images.txt中填写的多个镜像。
    内网环境批量拉取、上传Docker镜像的脚本_第4张图片
  • 等待脚本执行完成
    内网环境批量拉取、上传Docker镜像的脚本_第5张图片
  • 查看,目录下会多出一个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.txtpush_images.sh脚本复制到内网中能够连接到内网镜像仓库的Linux主机上。
    内网环境批量拉取、上传Docker镜像的脚本_第6张图片
  • 执行以下命令启动批量上传脚本
    sudo chmod -R 777 *
    ./push_images.sh
    
  • 根据提示输入内网的镜像仓库地址、外网的镜像仓库地址。脚本将会解压并加载images.tar.gz压缩包中的镜像,并重命名成内网的镜像,最后推送镜像。
    内网环境批量拉取、上传Docker镜像的脚本_第7张图片
  • 等待脚本执行完成,最后会打印出内网的镜像的完整的名字,可以直接复制这里打印的名字去进行镜像部署或更新即可。
    内网环境批量拉取、上传Docker镜像的脚本_第8张图片

(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}"

你可能感兴趣的:(JAVA,批量上传镜像脚本,批量拉取镜像脚本)