这是在公司作应用部署的时候,在研究offline(离线)部署时,写的脚本,并使用ansible的playbook调用执行。

环境是docker/k8s集群,本身使用ansible在安装应用的时候,会在github下载一些Dockerfile来构建docker image,会消耗大量的时间,甚至会在网络不好的时候,会出现网络中断,所以领导让我去做半离线状态的一个方式,并总结文档。

我首选是将已有环境中已经构建好在用的docker镜像导出本地,进行保存,供离线导入使用,会节省很多时间,因为此脚本只涉及到docker 镜像的操作,所以不过多阐述其他离线的想法。

我是因为公司docker镜像多才会想要去写这样的脚本的,不然手动就是重复性的工作,脚本不就是为了解决很多运维重复性的工作吗,尽管我的shell不是成熟的,但这样普通的脚本还是没问题的(我**写了两天,有点头疼),下面直接上脚本吧

docker image导出脚本

公司的应用想要做本地化或者离线部署,且环境中存在docker/k8s,很多镜像通过外网代理拉取或者Dockerfile构建,所以将镜像使用save -o保存到本地,作为镜像的备份,也作为离线部署的方法,因为镜像较多(经统计是45个),每条命令敲一遍属实麻烦,作为一个shell的新用户,决定尝试去写一个脚本来达到目的

经过长达两三天的研究,也是终于写出来了,如下,因为是新手,所以有些想法了,是问了大神和经过查阅资料的,尽管写了没多少,勿喷~

#!/bin/bash

# 定义镜像存放目录
dir="/docker_img/images/"
if [ ! -d $dir ]; then
    mkdir $dir 
fi
# 定义镜像文件名
# 将会出现在当前脚本所在目录
file_name="img_name.file"   
save_name="save_name.file"

# 提取image_name save to save_name.file
docker images | grep -v REPOSITORY | awk -F ':' -v OFS='' '{print $1,$2}' | awk '{print $1"_"$2}' > $save_name


# 提取image_name and image_tag save to img_name.file
# 这一步会将docker 私有仓库镜像名中冒号给删掉
docker images | grep -v REPOSITORY | awk -F ':' -v OFS='' '{print $1,$2}' | awk '{print $1":"$2}' > $file_name

###########################################################################
####这部分是剔除保存名中不能有" /",和一些构建失败或者没有tag的镜像(关于none)####
##############最后5000的部分是docker私库镜像保存名中去掉ip的操作##############
###########################################################################
# 镜像保存名中不能有"/"
sed -i 's/\//_/g' $save_name
# 删除标签为none的进行标签
sed -i 's/\:<none>//' $file_name
sed -i 's/\_<none>//' $save_name
# 删除行中有none的行
sed -i '/<none>/d' $file_name
sed -i '/<none>/d' $save_name
# 添加私有仓库镜像名中的冒号
sed -i 's/5000/\:&/g' $file_name
sed -i 's/5000/\:&/g' $save_name
###########################################################################
###########################################################################


# 使用for循环执行docker save -o
# 这里使用数字的递增来控制两个for循环文件中的行,各行对应
a=1
for img_name in $(cat $file_name); do
    b=1
    registry="172.16.182.1195000_node-feature-discovery_v0.5.0"
    for se_name in $(cat $save_name); do
        if [ $a -eq $b ] && [ "`echo ${se_name} | grep 5000`" = ${registry} ]; then
            se_name=`echo ${se_name} | awk -F: '{print $2}'`
            docker save -o ${dir}${se_name} $img_name
            continue
        elif [ $a -eq $b ]; then
            docker save -o ${dir}${se_name} $img_name
        fi
        let b++
    done
    let a++
done && echo "successful"

docker image 导入脚本

vim docker_input.sh
#!/bin/bash
# 视环境而定,可更改目录或者网卡接口等
img_dir="/docker_images/OpenNESS_Docker_img/"   # 本地镜像的存放位置
img_file="/root/img_file.txt"   # 镜像名所在的文件

ls $img_dir > $img_file
for i in `cat $img_file`; do
    registry="5000_node-feature-discovery_v0.5.0"
    if [ `echo $i` = $registry ]; then
        docker load --input ${img_dir}${i}
        HOST_IP=`ip a | grep eno1 | grep inet | awk '{print $2}' | awk -F'/' '{print $1}'`
        OLD_REGISTRY="172.16.182.119:5000/node-feature-discovery:v0.5.0"
        docker tag $OLD_REGISTRY "$HOST_IP":5000/node-feature-discovery:v0.5.0
        docker rmi -f $OLD_REGISTRY
    else
        docker load --input ${img_dir}${i}
    fi
done

2021-04-18更新优化脚本

此次更新仅仅适用于一般镜像,如有特殊情况,请自行加入判断

导出脚本

#!/bin/bash

# 此脚本仅适合所有镜像都是正常的 "image:tag" 格式镜像
# 如果存在 "image:none" 或者 "none:none" 的情况请加入判断
# 或者将不符合格式的镜像删除或改名
# "none:none" 一般为构建失败或者下载失败的镜像

# 获取到 "image:tag" 格式的镜像名
IMG_NAME=`docker images | grep -v TAG | awk '{print $1":"$2}'`
# echo $IMG_NAME | awk '{gsub(/ /,"\n",$0)} {print $0}'

# 如果原本镜像名中存在 "/" 是需要去掉的

# 定义镜像存放目录
DIR="/data/docker/image_tar"
if [ ! -d "$DIR" ]; then
  echo -e "\033[34m${DIR}\033[0m 不存在"
  mkdir -p "$DIR"
  echo -e "\033[34m${DIR}\033[0m 已创建"
else
  echo -e "\033[34m${DIR}\033[0m 已存在"
fi
echo ""
for IMAGE in $IMG_NAME
do
  echo -e "正在保存 \033[33m${IMAGE}\033[0m"
  SAVE_NAME=`echo $IMAGE | awk -F: '{print $1"_"$2}' | sed 's/\//_/g'`
  docker save $IMAGE -o ${DIR}/${SAVE_NAME}.tar
  echo -e "已保存到 \033[34m${DIR}/\033[31m${SAVE_NAME}.tar\033[0m"
  echo ""
done

导入脚本

#!/bin/bash

# 在此处填写镜像文件的保存目录
IMAGE_DIR="/data/docker/image_tar"

for IMAGE in `ls $IMAGE_DIR`
do
  echo -e "正在导入镜像 \033[33m$IMAGE\033[0m"
  docker load -i ${IMAGE_DIR}/${IMAGE}
  echo -e "已成功导入镜像 \033[33m$IMAGE\033[0m"
  echo ""
done

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0