199 lines
No EOL
4.2 KiB
Bash
199 lines
No EOL
4.2 KiB
Bash
#! /usr/bin/env sh
|
|
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
--dry-run)
|
|
DRY_RUN=1
|
|
shift
|
|
;;
|
|
--*)
|
|
echo "Illegal Operation"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
is_dry_run() {
|
|
if [ -z "$DRY_RUN" ]; then
|
|
return 1
|
|
else
|
|
return 0
|
|
fi
|
|
}
|
|
|
|
command_exists() {
|
|
command -v "$@" > /dev/null 2>&1
|
|
}
|
|
|
|
to_lower() {
|
|
echo "$@" | tr '[:upper:]' '[:lower:]'
|
|
}
|
|
|
|
|
|
check_distro() {
|
|
distro=""
|
|
if [ -r /etc/os-release ]; then
|
|
distro="$(. /etc/os-release && echo "$ID")"
|
|
fi
|
|
echo "$distro"
|
|
}
|
|
|
|
detect_debian_version() {
|
|
version=""
|
|
vers_num="$(sed 's/\/.*//' /etc/debian_version | sed 's/\..*//')"
|
|
case "$vers_num" in
|
|
12 | trixie)
|
|
version="bookworm"
|
|
;;
|
|
11)
|
|
version="bullseye"
|
|
;;
|
|
10)
|
|
version="buster"
|
|
;;
|
|
9)
|
|
version="stretch"
|
|
;;
|
|
8)
|
|
version="jessie"
|
|
;;
|
|
esac
|
|
echo "$version"
|
|
}
|
|
|
|
exec_command() {
|
|
uid="$(id -u 2>/dev/null || true)"
|
|
sh_c="sh -c"
|
|
if [ "$uid" != 0 ]; then
|
|
if command_exists sudo; then
|
|
sh_c="sudo -E sh -c"
|
|
elif command_exists su; then
|
|
sh_c="su -c"
|
|
else
|
|
cat >&2 <<-'EOF'
|
|
Error: no method for command elevation found, but thats needed for this setup script
|
|
EOF
|
|
exit 1
|
|
fi
|
|
fi
|
|
if is_dry_run; then
|
|
sh_c="echo"
|
|
fi
|
|
echo $sh_c
|
|
}
|
|
|
|
install_docker_apt() {
|
|
pre_reqs="apt-transport-https ca-certificates curl"
|
|
rem_pkgs="docker.io docker-doc docker-compose podman-docker containerd runc"
|
|
inst_pkgs="docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin"
|
|
apt_repo="deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] $download_url/linux/$distro $version $channel"
|
|
(
|
|
if ! is_dry_run; then
|
|
set -x
|
|
fi
|
|
$sh_c 'apt-get update -qq >/dev/null'
|
|
$sh_c "DEBIAN_FRONTEND=noninteractive apt-get remove -y -qq $rem_pkgs >/dev/null"
|
|
$sh_c "DEBIAN_FRONTEND=noninteractive apt-get install -y -qq $pre_reqs >/dev/null"
|
|
$sh_c 'install -m 0755 -d /etc/apt/keyrings'
|
|
$sh_c "curl -fsSL \"$download_url/linux/$distro/gpg\" -o /etc/apt/keyrings/docker.asc"
|
|
$sh_c "chmod a+r /etc/apt/keyrings/docker.asc"
|
|
$sh_c "echo \"$apt_repo\" > /etc/apt/sources.list.d/docker.list"
|
|
$sh_c 'apt-get update -qq >/dev/null'
|
|
$sh_c "DEBIAN_FRONTEND=noninteractive apt-get install -y -qq $inst_pkgs >/dev/null"
|
|
)
|
|
}
|
|
|
|
install_acl_apt() {
|
|
inst_pkgs="acl"
|
|
(
|
|
if ! is_dry_run; then
|
|
set -x
|
|
fi
|
|
$sh_c 'apt-get update -qq >/dev/null'
|
|
$sh_c "DEBIAN_FRONTEND=noninteractive apt-get install -y -qq $inst_pkgs >/dev/null"
|
|
)
|
|
}
|
|
|
|
group_add_docker() {
|
|
sh_c="$( exec_command )"
|
|
if [ -f /sbin/usermod ]; then
|
|
$sh_c "usermod -aG docker $(id -un)"
|
|
else
|
|
cat >&2 <<-'EOF'
|
|
Error: no command for group editing found
|
|
EOF
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
start_docker_boot() {
|
|
sh_c="$( exec_command )"
|
|
if command_exists systemctl; then
|
|
$sh_c 'systemctl enable --now docker.service'
|
|
else
|
|
cat >&2 <<-'EOF'
|
|
Error: no supported init system found
|
|
EOF
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
mk_docker_dir() {
|
|
docker_root="/opt"
|
|
sh_c="$( exec_command )"
|
|
if ! command_exists setfacl; then
|
|
install_acl_apt
|
|
fi
|
|
(
|
|
if ! is_dry_run; then
|
|
set -x
|
|
fi
|
|
$sh_c "mkdir -p $docker_root/docker/ $docker_root/docker/compose $docker_root/docker/data"
|
|
$sh_c "chgrp -R docker $docker_root/docker"
|
|
$sh_c "chmod -R g+s $docker_root/docker"
|
|
$sh_c "setfacl -R -m u::rwx,g::rwx $docker_root/docker"
|
|
$sh_c "setfacl -R -d --set u::rwx,g::rwx,o::r-x $docker_root/docker"
|
|
)
|
|
}
|
|
|
|
install_docker() {
|
|
sh_c="$( exec_command )"
|
|
distro="$( check_distro )"
|
|
version=""
|
|
channel="stable"
|
|
download_url="https://download.docker.com"
|
|
case "$distro" in
|
|
debian)
|
|
echo " Debian detected"
|
|
version="$( detect_debian_version )"
|
|
install_docker_apt
|
|
echo " Docker successfully installed"
|
|
;;
|
|
*)
|
|
echo "Sorry currently only debian is supported"
|
|
esac
|
|
}
|
|
|
|
read -p "Install docker? (y/N) " if_docker_group
|
|
case $(to_lower $if_docker_group) in
|
|
"yes" | "y" | "yeah" | 1)
|
|
install docker
|
|
;;
|
|
esac
|
|
read -p "Add $(id -un) to docker group? (y/N) " if_docker_group
|
|
case $(to_lower $if_docker_group) in
|
|
"yes" | "y" | "yeah" | 1)
|
|
group_add_docker
|
|
;;
|
|
esac
|
|
read -p "Start Docker at boot? (y/N)" if_start_docker_boot
|
|
case $(to_lower $if_start_docker_boot) in
|
|
"yes" | "y" | "yeah" | 1)
|
|
start_docker_boot
|
|
;;
|
|
esac
|
|
read -p "Create Docker dir with ACL permissions? (y/N)" if_mk_docker_dir
|
|
case $(to_lower $if_mk_docker_dir) in
|
|
"yes" | "y" | "yeah" | 1)
|
|
mk_docker_dir
|
|
;;
|
|
esac |