写了一个脚本,自动化gcc 和 docker安装过程。
优点:
- 自动化
- 快速
- 不依赖网络
- 屏蔽配置细节
缺点:
- 对安装过程无感知
- 只能安装固定版本docker( docker ce 18),gcc( 9.1)
gcc 脚本制作过程:
- 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
#>>>
- 下载 gcc 9.1
wget https://bigsearcher.com/mirrors/gcc/releases/gcc-9.1.0/gcc-9.1.0.tar.gz
- 将 gcc 9.1 追加到脚本后面
cat gcc-9.1.0.tar.gz >> installgcc.sh
docker 脚本制作过程:
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
#>>>
- 下载 docker ce 18
wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.2-ce.tgz
- 将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