#!/bin/bash
###############################################################
## 私有镜像仓库更新工具
## 彬彬的木头
## 2018年4月28日
## Docker-ce 17.12.0-ce
################################################################
## 用于更新私有镜像仓库中的docker镜像
##使用方法:
##
## 1、指定一个参数,更新设定的所有镜像到指定地址
##命令格式:
##例:
## ./docker_ce_upgrade.sh 192.168.1.1:5000
################################################################
##2、使用两个参数,更新指定镜像
##命令格式:
##例:
##./docker_ce_upgrade.sh 192.168.1.1:5000 centos:latest
################################################################
##3、使用三个参数,从指定来源更新指定镜像到指定服务器
##命令格式:
##例:
##./docker_ce_upgrade.sh 192.168.1.1:5000 centos:latest 192.168.1.2:5000
################################################################
##脚本内变量列表:
## SERVER_ADDRESS 镜像源仓库地址
## base 制定镜像的列表,默认使用该变量更新所有Docker镜像
##
################################################################
##------------------变量列表 start---------------------------------------
## 镜像源地址
SERVER_ADDRESS=hub.docker.io
##基础组件列表
base=(
centos:latest
busybox:latest
)
##------------------变量列表 stop----------------------------------------
##------------------函数部分 start---------------------------------------
##设置hosts函数
function host_set {
cat >> /etc/hosts << EOF
172.0.0.1 docker-release.com
EOF
}
##清理hosts
function host_clear {
sed -i '/docker-release' /etc/hosts
}
##拉取镜像
##$1 源仓库地址
##$2 组件名称
##$3 版本号
function pull {
docker pull $1/$2:$3
}
##标记镜像
##$1 源仓库地址
##$2 组件名称
##$3 版本号
##$4 目的仓库地址
function tag {
docker tag $1/$2:$3 $4/$2:$3
}
##推送镜像函数
##$1 目的仓库地址
##$2 组件名称
##$3 版本号
function push {
docker push $1/$2:$3
}
##删除本地镜像
##$1 仓库地址
##$2 组件名称
##$3 版本号
function delete {
docker rmi $1/$2:$3
}
##拆分组件信息
##$1 组件名称:组件版本
function cut {
IFS=':'
arr=($1)
CompName=${arr[0]}
Version=${arr[1]}
IFS=' '
}
##判断输入参数,如果没有输入则提示并退出
##当只有一个参数时更新指定景象仓库的全部镜像
##当有两个参数时,检查第二个参数,不合法则退出,不更新镜像
##当两个参数都合法时,更新指定镜像到指定镜像仓库
##当有三个参数时,第三个参数为镜像来源服务器
function input_test {
if [ !n "$1" ]
then
echo "未附带任何参数,直接退出脚本"
echo "可以只更新指定的镜像,此时需要两个参数"
echo "命令格式为:"
echo "docker_upgrade.sh “欲更新的镜像仓库地址” “更新的组件名称:版本号”"
echo "使用英文冒号分隔版本号"
echo "例:"
echo "./docker_upgrade.sh 192.168.1.1:5000 centos:latest"
echo ""
echo "或只添加目的镜像仓库参数,此时更新已知全部组件"
echo "命令格式为:"
echo "docker_upgrade.sh “欲更新的镜像仓库地址”"
echo "例:"
echo "./docker_upgrade.sh 192.168.1.1:5000"
echo "如果使用三个参数,则第三个参数被指定为镜像来源服务器"
##不附带任何参数则直接退出脚本
exit 1
else
##设置目的镜像仓库地址
TARGET_HOST=$1
##判断是否指定了要更新的组件,没有则使用脚本内指定的组件列表
##当有两个参数时,检查第二个参数,如果不合法则退出,不更新镜像
##当两个参数都合法时,更新指定镜像到指定镜像仓库
##要更新的组件列表 镜像名:源版本:目的版本,每一行是一个组件
##当有三个参数时,第三个参数被指定为镜像来源服务器
if [ ! -n "$2" ]
then
echo "未提供具体组件名,更新${1}全部组件至已知最新版本"
sleep 1s
components=${base[@]}
else
##更新指定组件
cut $2
##判断版本是否输入完整
components=($2)
##当有三个参数时,第三个参数被指定为镜像来源服务器
if [ -n "$3" ]
then
##使用指定镜像服务器
echo “echo "从${3}更新${1}的组件${CompName}至${Version}版本"”
SERVER_ADDRESS=${3}
fi
fi
fi
}
function clear_image {
if [ "$1" = "y" -o "$1" = "Y" ]
then
echo "清理本次下载的镜像"
sleep 1s
for rmi in ${components[@]}
do
##拆分组件信息为数组
cut $rmi
##删除目标镜像
delete $TARGET_HOST $CompName $tVersion
##删除源镜像
delete $SERVER_ADDRESS $CompName $Version
done
exit 0
else
echo "不清理镜像,直接退出"
exit 0
fi
}
function proxy_enable {
mkdir -p /etc/systemd/system/docker.service.d/
cat > /etc/systemd/system/docker.service.d/http-proxy.conf << EOF
[Service]
Environment="HTTP_PROXY=http://172.21.0.5:808/"
Environment="NO_PROXY=localhost,127.0.0.0/8,172.0.0.0/8,192.168.0.0/16"
EOF
}
function proxy_disable {
##删除docker代理
rm -rf /etc/systemd/system/docker.service.d
}
function docker_restart {
##重启Docker服务
systemctl daemon-reload
systemctl restart docker
##启动kubelet
# systemctl start kubelet
}
##配置Docker配置文件,配置镜像仓库地址
##备份原配置文件
##检查Docker版本,ce版本则替换/etc/docker/daemon.json,老版本则替换/etc/sysconfig/docker
function docker_config_modify {
##老版本配置文件
if [ -e /etc/sysconfig/docker ]
then
mv -f /etc/sysconfig/docker /etc/sysconfig/docker.bak
elif [ -e /etc/docker/daemon.json ]
then
#新版本配置文件
mv /etc/docker/daemon.json /etc/docker/daemon.json.bak
fi
docker_version=`docker -v | grep ce`
if [ -n "$docker_version" ]
then
#echo "`docker -v`"
##生成新配置文件
##17.12.0-ce版本配置文件
cat > /etc/docker/daemon.json << EOF
{
"insecure-registries":["${SERVER_ADDRESS}","${TARGET_HOST}"]
}
EOF
else
# echo "`docker -v`"
##以下为老版本(1.12.6)配置文件
cat > /etc/sysconfig/docker <<EOF
# /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
if [ -z "\${DOCKER_CERT_PATH}" ]; then
DOCKER_CERT_PATH=/etc/docker
fi
ADD_REGISTRY='--add-registry ${TARGET_HOST} --add-registry ${SERVER_ADDRESS} '
INSECURE_REGISTRY='--insecure-registry ${TARGET_HOST} --insecure-registry ${SERVER_ADDRESS}'
EOF
fi
}
function docker_status_check {
docker_status=`systemctl status docker | grep running`
if [ ! -n "$docker_status" ]
then
echo "Docker is not running"
echo "Docker服务未正常启动,请检查配置"
exit 1
else
echo "Docker is running"
fi
}
##------------------函数部分 stop----------------------------------------
##------------------实际执行 start---------------------------------------
##具体更新过程
##检查输入
input_test $1 $2 $3
##清理hosts
hosts_clear
#设置hosts
hosts_set
##修改docker代理
##使用内部docker的时候不需要代理,放开proxy_disable
# proxy_enable
proxy_disable
##修改docker配置文件
docker_config_modify
##重启docker服务
docker_restart
##检查docker状态
docker_status_check
##逐个下载镜像
for image in ${components[@]}
do
##拆分组件信息为数组
echo $image
cut $image
##下载镜像
pull $SERVER_ADDRESS $CompName $Version
##标记镜像
tag $SERVER_ADDRESS $CompName $Version $TARGET_HOST
##上传镜像
push $TARGET_HOST $CompName $Version
done
##清除镜像
echo "是否删除本次下载镜像以节省本机空间?(y or n)"
read flag
clear_image ${flag}
##清理hosts
hosts_clear
##------------------实际执行 stop----------------------------------------
一个从指定服务器更新docker镜像的脚本
最新推荐文章于 2025-03-27 18:57:24 发布