#!/bin/bash
#
#***************************************************************************
# Author: liwanggui
# Email: liwanggui@163.com
# Date: 2023-08-10
# FileName: install-docker.sh
# Description: 在线安装 docker & docker-compose
# Copyright (C): 2023 All rights reserved
#***************************************************************************
# 
# 安装最新版本 docker:
#    $ curl -s https://dl.zrshuiwu.com/scripts/install-docker.sh | bash
# 安装指定版本的 docker 和 docker-compose:
#    $ curl -s https://dl.zrshuiwu.com/scripts/install-docker.sh | DOCKER_VERSION=24.0.6  DOCKER_COMPOSE_VERSION=v2.23.0 bash
# 


# 平台架构
ARCH=$(arch || uname -m)
# 默认安装最新版本
DOCKER_VERSION=${DOCKER_VERSION:-latest}
DOCKER_COMPOSE_VERSION=${DOCKER_COMPOSE_VERSION:-latest}
# github 加速代理
GITHUB_PROXY=${GITHUB_PROXY:-https://gh.wglee.org/}
# docker
DOCKER_RELEASE_API="https://api.github.com/repos/moby/moby/releases/latest"
DOCKER_DOWNLOAD_URL=https://download.docker.com/linux/static/stable/${ARCH}
# docker compose
DOCKER_COMPOSE_RELEASE_API="https://api.github.com/repos/docker/compose/releases/latest"
DOCKER_COMPOSE_DOWNLOAD_URL=${GITHUB_PROXY}https://github.com/docker/compose/releases/download
# 自动实例脚本 (bash)
DOCKER_COMPLETION_SCRIPT="${GITHUB_PROXY}https://gist.githubusercontent.com/liwanggui/a7aacd89602bd6ef625292ba2d2ef10f/raw/3e6c5772d30938d198ae9466df067ebc1ebb52d9/docker"
# docker 安装路径
INSTALL_DIR=/usr/bin
# docker-compose 安装路径
DOCKER_PLUGIN_DIR=/usr/libexec/docker/cli-plugins
# 临时目录
TEMPDIR=$(mktemp -d)


error () {
    echo -e "\e[0;31m[ERROR] - $(date +'%F %T') -\e[0m $@"
}

info () {
    echo -e "\e[0;34m[INFO] - $(date +'%F %T') -\e[0m $@"
}

_wget() {
    local url="$1"
    local save_name="$2"
    local opts

    if [[ -n "${save_name}" ]]; then
        opts="-O ${save_name}"
    fi

    info "下载 ${url}"
    if ! wget -q --show-progress --tries=3 --timeout=30 "${url}" ${opts}; then
        error "下载失败，请检查后重试!"
        /bin/rm -rf ${TEMPDIR}
        exit 1
    fi
}

get_latest_version() {
    local api_url="$1"
    curl -s ${api_url} | grep tag_name | cut -f4 -d "\""
}

install_docker() {
    local docker_ce_url
    local docker_rootless_extras

    if [[ "$DOCKER_VERSION" = "latest" ]]; then
        # DOCKER_VERSION=$(curl -s ${DOCKER_DOWNLOAD_URL%/}/ | grep -Eo 'docker-[0-9\.]+tgz' | sort | uniq | tail -n1 | awk -F'docker-|.tgz' '{print $2}')
        DOCKER_VERSION=$(get_latest_version ${DOCKER_RELEASE_API})
        # 去除版本字符 "v"
        DOCKER_VERSION=${DOCKER_VERSION#v}
    fi

    docker_ce_url="${DOCKER_DOWNLOAD_URL%/}/docker-${DOCKER_VERSION}.tgz"
    docker_rootless_extras="${DOCKER_DOWNLOAD_URL%/}/docker-rootless-extras-${DOCKER_VERSION}.tgz"

    cd ${TEMPDIR}
    
    _wget ${docker_ce_url}
    _wget ${docker_rootless_extras}
    
    info "安装 $(basename ${docker_ce_url}) 至 ${INSTALL_DIR}"
    tar xzvf $(basename ${docker_ce_url}) --strip=1 -C ${INSTALL_DIR}/

    info "安装 $(basename ${docker_rootless_extras}) 至 ${INSTALL_DIR}"
    tar xzvf $(basename ${docker_rootless_extras}) --strip=1 -C ${INSTALL_DIR}/

    [ -d /etc/docker ] || mkdir -vp /etc/docker

    info "创建配置文件: /etc/docker/daemon.json"
    cat >/etc/docker/daemon.json<<EOF
{
  "registry-mirrors": [
	  "https://faz0udyr.mirror.aliyuncs.com",
	  "https://docker.mirrors.ustc.edu.cn",
	  "http://hub-mirror.c.163.com"
  ],
  "log-driver": "json-file",
  "log-opts": { "max-size": "100m"},
  "live-restore": true
}
EOF

    info "创建配置文件 /etc/sysconfig/docker"
    cat >/etc/sysconfig/docker<<EOF
# /etc/sysconfig/docker

# Modify these options if you want to change the way the docker daemon runs
OPTIONS="--selinux-enabled"
EOF

    info "创建 service 文件 /usr/lib/systemd/system/docker.service"
    cat >/usr/lib/systemd/system/docker.service<<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target network.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/docker
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd \$OPTIONS
ExecReload=/bin/kill -s HUP \$MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
#Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
EOF

}


install_compsoe() {
    local docker_compose_url

    if [[ "$DOCKER_COMPOSE_VERSION" = "latest" ]]; then
        DOCKER_COMPOSE_VERSION=$(get_latest_version ${DOCKER_COMPOSE_RELEASE_API})
    fi

    docker_compose_url=${DOCKER_COMPOSE_DOWNLOAD_URL}/${DOCKER_COMPOSE_VERSION}/docker-compose-linux-${ARCH}
    
    [ -d "$DOCKER_PLUGIN_DIR" ] || mkdir -p $DOCKER_PLUGIN_DIR

    cd ${TEMPDIR}

    _wget ${docker_compose_url}

    info "安装 $(basename ${docker_compose_url}) 至 ${DOCKER_PLUGIN_DIR}/docker-compose"
    install $(basename ${docker_compose_url}) ${DOCKER_PLUGIN_DIR}/docker-compose

    info "配置 docker 命令补全"
    curl -sfL --create-dirs $DOCKER_COMPLETION_SCRIPT -o /usr/share/bash-completion/completions/docker
}


main () {
    install_docker
    install_compsoe
    /bin/rm -rf ${TEMPDIR}

    cat <<EOF

-----------------------------------------------
$(echo -e "\e[0;34m安装完成，使用以下命令启动 Docker:\e[0m")
  $ sudo systemctl start docker.service
  or
  $ sudo systemctl enable --now docker.service

EOF
}

main 
