一个从指定服务器更新docker镜像的脚本

#!/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
                ##使用指定镜像服务器
                echoecho "从${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----------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值