基础镜像更新脚本
参考本目录下的脚本文件 getbasediff.sh 和 updatebase.sh
- 本地开发机器上: SOURCEIMG=$1 SOURCETAG=$2 TARGETIMG=$3 TARGETTAG=$4 OVERLAYDIR=/var/lib/docker/overlay2
1.1 准备
#安装jq yum install -y jq #拉取镜像到本地 docker pull $SOURCEIMG:$SOURCETAG docker pull $TARGETIMG:$TARGETTAG
1.2 找源基础镜像的最上层目录UpperDir
UpperDir=docker inspect $SOURCEIMG:$SOURCETAG |jq .[0].GraphDriver.Data.UpperDir |sed 's/\"//g'
1.3 找目标镜像中在源镜像UpperDir之上的目录/diff(如果没有取目标镜像所有目录/diff)按顺序由低到高排序
declare -a arr1
SS=docker inspect $TARGETIMG:$TARGETTAG |jq .[0].GraphDriver.Data.LowerDir |sed 's/\"//g'
arr=(docker inspect $TARGETIMG:$TARGETTAG |jq .[0].GraphDriver.Data.UpperDir |sed 's/\"//g'
arr1[$j]=$newupperdir
1.4 将1.2中所有目录内容依次写入“overlay2/tmp/base-目标镜像版本号”中,逐层覆盖
TMPDIR=$OVERLAYDIR/tmp/BASE-$TARGETTAG/diff
mkdir -p
1.5 将/tmp/BASE-$TARGETTAG/diff下的内容打包
cd $TMPDIR/.. tar -cvzf BASE-$TARGETTAG-diff.tar.gz ./diff
- 对所有生产节点执行:(需要安装jq)
OVERLAYDIR=/mnt/disk01/docker/overlay2 SOURCEIMG=$1 SOURCETAG=$2 TARGETIMG=$3 TARGETTAG=$4
2.1 将变更文件包BASE-$TARGETTAG-diff.tar.gz上传到该节点的$OVERLAYDIR/tmp/下
2.2 查找要更新的基础镜像最上层目录UpperDir(备份源最上层目录,可供恢复)
TMPDIR=$OVERLAYDIR/tmp/BASE-$TARGETTAG/diff
mkdir -p $TMPDIR
cd $TMPDIR/../..
#如果tmp/baseimg.properties文件存在,从中读取基础镜像最上层目录base.dir和原版本号,否则从源基础镜像中获取
if [ -f "baseimg.properties" ]; then
UpperDir=grep "base.dir" baseimg.properties | cut -d'=' -f2 | sed 's/\r//'
BaseVer=grep "base.ver" baseimg.properties | cut -d'=' -f2 | sed 's/\r//'
else
UpperDir=docker inspect $SOURCEIMG:$SOURCETAG |jq .[0].GraphDriver.Data.UpperDir |sed 's/\"//g'
BaseVer=$SOURCETAG
echo "base.dir=$UpperDir" > baseimg.properties
echo "base.ver=$SOURCETAG" >> baseimg.properties
fi
#备份源最上层目录
mkdir -p $TMPDIR/../../backup/$BaseVer
\cp -af $UpperDir/* $TMPDIR/../../backup/$BaseVer/
2.3 解压变更文件包再覆盖基础镜像目录/diff
cd $TMPDIR/../.. tar -xvzf BASE-$TARGETTAG-diff.tar.gz -C $TMPDIR/../ \cp -af $TMPDIR/* $UpperDir/ sed -i "s#^base.ver=.*#base.ver=$TARGETTAG#g" $TMPDIR/../../baseimg.properties