一鍵安裝gcc 和 docker

寫了一個腳本,自動化gcc 和 docker安裝過程。

優點:

  1. 自動化
  2. 快速
  3. 不依賴網絡
  4. 屏蔽配置細節

缺點:

  1. 對安裝過程無感知
  2. 只能安裝固定版本docker( docker ce 18),gcc( 9.1)

gcc 腳本製作過程:

  1. shell 腳本 installgcc.sh
#! /bin/bash

# This is just a little script that can install gcc 
# version: gcc 9.1 
# platform: centos/linux host
#
# by and for kdvp-team

set -eu

usage() {
    cat 1>&2 <<EOF
installgcc.sh 1.0.0
The gcc installer for kdvp-team

USAGE:
    sh installgcc.sh

that's it, all done.
EOF
}

main() {
    need_cmd uname
    need_cmd mktemp
    need_cmd chmod
    need_cmd mkdir
    need_cmd rm
    need_cmd rmdir

    ensure mkdir -p $HOME/.local/bin

    install
    addpathandalias
}

say() {
    nowstr=$(date +"%Y-%m-%d %H:%M:%S")
    printf $nowstr
    printf ' : %s\n' "$1"
}

err() {
    say "$1" >&2
    exit 1
}

need_cmd() {
    if ! check_cmd "$1"; then
        err "need '$1' (command not found)"
    fi
}

check_cmd() {
    command -v "$1" > /dev/null 2>&1
}

ensure() {
    if ! "$@"; then err "command failed: $*"; fi
}

install() {
        ln=`awk '/^#>>>/{print NR}' $0`
        let ln++
        TEMPDIR=`mktemp -d gcc.XXX`

        tail -n +$ln $0 | tar -xzf - -C $TEMPDIR
        if [ $? -ne 0 ]; then
                rm -rf $TEMPDIR
                exit 1
        fi

	cd $TEMPDIR/gcc-9.1.0 && ./contrib/download_prerequisites
	if $? -ne 0; then
		rm -rf $TEMPDIR
		exit 1
	fi

	mkdir objdir && cd objdir && ../configure --preifx=$HOME/.local
	if $? -ne 0; then
		rm -rf $TEMPDIR
		exit 1
	fi

	if ! make -j8; then
		rm -rf $TEMPDIR
		exit 1
	fi

	if ! make install; then
		rm -rf $TEMPDIR
		exit 1
	fi

        rm -rf $TEMPDIR
}

# add $HOME/.local/bin to user's PATH variable
addpathandalias() {
	cat  >> $HOME/.bash_profile <<'EOF'
export $HOME/.local/bin:$PATH
EOF
}

printelips() {
	echo "installing... "
	while :; do
		printf "... "
		sleep .2
	done
}

main "$@" || exit 1
echo $(tput setaf 2) install complete ! $(tput sgr0)
echo $(tput setaf 2) please source your profile: ! $(tput sgr0)
cat <<eof
$(tput setaf 2)
source ~/.bash_profile
$(tput sgr0)
eof

exit 0
#>>>
  1. 下載 gcc 9.1
wget https://bigsearcher.com/mirrors/gcc/releases/gcc-9.1.0/gcc-9.1.0.tar.gz
  1. 將 gcc 9.1 追加到腳本後面
cat gcc-9.1.0.tar.gz >> installgcc.sh

docker 腳本製作過程:

  1. installdocker.sh 腳本
#! /bin/bash

# This is just a little script that can install docker 
# version: docker ce 18 
# platform: centos/linux host
#
# by and for kdvp-team

set -eu

usage() {
    cat 1>&2 <<EOF
installdocker.sh 1.0.0
The docker installer for kdvp-team

USAGE:
    sh installdocker.sh

that's it, all done.
EOF
}

main() {
    need_cmd uname
    need_cmd mktemp
    need_cmd chmod
    need_cmd mkdir
    need_cmd rm
    need_cmd rmdir

    ensure mkdir -p $HOME/.local/bin

    install
    addpathandalias
    check_or_add_docker_group
}

say() {
    nowstr=$(date +"%Y-%m-%d %H:%M:%S")
    printf $nowstr
    printf ' : %s\n' "$1"
}

err() {
    say "$1" >&2
    exit 1
}

need_cmd() {
    if ! check_cmd "$1"; then
        err "need '$1' (command not found)"
    fi
}

check_cmd() {
    command -v "$1" > /dev/null 2>&1
}

ensure() {
    if ! "$@"; then err "command failed: $*"; fi
}


# check or add docker group
check_or_add_docker_group() {
	sudo groupadd docker > /dev/null 2>&1
	sudo usermod -aG docker $(whoami)
}

install() {
        ln=`awk '/^#>>>/{print NR}' $0`
        let ln++
        TEMPDIR=`mktemp -d docker.XXX`

        tail -n +$ln $0 | tar -xzf - -C $TEMPDIR
        if [ $? -ne 0 ]; then
                rm -rf $TEMPDIR
                exit 1
        fi

        if ! cp -r $TEMPDIR/docker/*  $HOME/.local/bin; then
                echo $(tput setaf 1) install binarys failed $(tput sgr0)
                rm -rf $TEMPDIR
                exit 1
        fi
        rm -rf $TEMPDIR
}

# add $HOME/.local/bin to user's PATH variable
addpathandalias() {
	cat  >> $HOME/.bash_profile <<'EOF'
export $HOME/.local/bin:$PATH
alias dockerd='sudo env "PATH=$PATH" HTTPS_PROXY=devnet-proxy.oa.com:8080 HTTP_PROXY=devnet-proxy.oa.com:8080 NO_PROXY=10.101.96.92,csighub.tencentyun.com,bk.artifactory.oa.com dockerd'
EOF
}

printelips() {
	echo "installing... "
	while :; do
		printf "... "
		sleep .2
	done
}

main "$@" || exit 1
echo $(tput setaf 2) install complete ! $(tput sgr0)
echo $(tput setaf 2) please source your profile: ! $(tput sgr0)
cat <<eof
$(tput setaf 2)
source ~/.bash_profile
$(tput sgr0)
eof

exit 0
#>>>
  1. 下載 docker ce 18
wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.2-ce.tgz
  1. 將docker追加到腳本後面
cat docker-18.06.2-ce.tgz >> installdocker.sh

爲了方便將常用到工作環境複製到其他機器,寫了一個腳本將本地開發環境製作成鏡像:

#! /bin/bash
set -eu

cd $HOME/.local
cp ../.bash_profile ../.vimrc .
sed 's/jianyongli/jianyong/g' .bash_profile -i
sed 's/jianyongli/jianyong/g' .vimrc -i

cat <<eof > Dockerfile
from some_basic_linux_image:latest

# create jianyong account
run useradd jianyong -d /data/jianyong -G wheel 
run mkdir /data/jianyong/.local -p

workdir /data/jianyong

# copy the world
copy . ./.local
copy .bash_profile .vimrc ./
eof

docker build . -t your_docker_repo/your_image:latest
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章