Add install-docker.sh
This commit is contained in:
152
install-docker.sh
Normal file
152
install-docker.sh
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
log() {
|
||||||
|
printf '\n[%s] %s\n' "$(date -u +'%Y-%m-%d %H:%M:%S UTC')" "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
require_root() {
|
||||||
|
if [[ ${EUID:-$(id -u)} -ne 0 ]]; then
|
||||||
|
echo "Please run this script as root or with sudo." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
command_exists() {
|
||||||
|
command -v "$1" >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
get_os_info() {
|
||||||
|
if [[ ! -f /etc/os-release ]]; then
|
||||||
|
echo "Cannot detect OS: /etc/os-release not found." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
. /etc/os-release
|
||||||
|
OS_ID="${ID:-}"
|
||||||
|
OS_LIKE="${ID_LIKE:-}"
|
||||||
|
OS_VERSION_ID="${VERSION_ID:-}"
|
||||||
|
OS_CODENAME="${UBUNTU_CODENAME:-${VERSION_CODENAME:-}}"
|
||||||
|
OS_NAME="${PRETTY_NAME:-${NAME:-unknown}}"
|
||||||
|
}
|
||||||
|
|
||||||
|
install_debian_family() {
|
||||||
|
log "Detected Debian/Ubuntu family: ${OS_NAME}"
|
||||||
|
|
||||||
|
apt update
|
||||||
|
apt install -y ca-certificates curl
|
||||||
|
install -m 0755 -d /etc/apt/keyrings
|
||||||
|
|
||||||
|
local repo_base
|
||||||
|
case "$OS_ID" in
|
||||||
|
ubuntu)
|
||||||
|
repo_base="https://download.docker.com/linux/ubuntu"
|
||||||
|
;;
|
||||||
|
debian)
|
||||||
|
repo_base="https://download.docker.com/linux/debian"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# Fallback for derivatives
|
||||||
|
repo_base="https://download.docker.com/linux/ubuntu"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
curl -fsSL "${repo_base}/gpg" -o /etc/apt/keyrings/docker.asc
|
||||||
|
chmod a+r /etc/apt/keyrings/docker.asc
|
||||||
|
|
||||||
|
if [[ -z "${OS_CODENAME}" ]]; then
|
||||||
|
echo "Could not determine distro codename from /etc/os-release." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat >/etc/apt/sources.list.d/docker.sources <<EOF
|
||||||
|
Types: deb
|
||||||
|
URIs: ${repo_base}
|
||||||
|
Suites: ${OS_CODENAME}
|
||||||
|
Components: stable
|
||||||
|
Architectures: $(dpkg --print-architecture)
|
||||||
|
Signed-By: /etc/apt/keyrings/docker.asc
|
||||||
|
EOF
|
||||||
|
|
||||||
|
apt update
|
||||||
|
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||||
|
|
||||||
|
if command_exists systemctl; then
|
||||||
|
if systemctl is-enabled docker >/dev/null 2>&1 || systemctl enable --now docker; then
|
||||||
|
log "Docker service enabled and started."
|
||||||
|
else
|
||||||
|
log "Docker installed, but systemd could not enable/start it automatically."
|
||||||
|
systemctl start docker || true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
install_rhel_family() {
|
||||||
|
log "Detected RHEL/Alma/Rocky/CentOS family: ${OS_NAME}"
|
||||||
|
|
||||||
|
if ! command_exists dnf; then
|
||||||
|
echo "dnf is required for RHEL-family installation but was not found." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnf -y install dnf-plugins-core
|
||||||
|
dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
|
||||||
|
dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||||
|
|
||||||
|
if command_exists systemctl; then
|
||||||
|
systemctl enable --now docker
|
||||||
|
log "Docker service enabled and started."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
verify_install() {
|
||||||
|
log "Verifying installation"
|
||||||
|
|
||||||
|
if command_exists docker; then
|
||||||
|
docker --version
|
||||||
|
else
|
||||||
|
echo "docker command not found after installation." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if docker compose version; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
echo "docker compose plugin not available after installation." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command_exists systemctl; then
|
||||||
|
systemctl --no-pager --full status docker || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
require_root
|
||||||
|
get_os_info
|
||||||
|
|
||||||
|
case "$OS_ID" in
|
||||||
|
ubuntu|debian)
|
||||||
|
install_debian_family
|
||||||
|
;;
|
||||||
|
almalinux|rhel|rocky|centos|fedora)
|
||||||
|
install_rhel_family
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if [[ "$OS_LIKE" == *debian* ]]; then
|
||||||
|
install_debian_family
|
||||||
|
elif [[ "$OS_LIKE" == *rhel* ]] || [[ "$OS_LIKE" == *fedora* ]]; then
|
||||||
|
install_rhel_family
|
||||||
|
else
|
||||||
|
echo "Unsupported OS: ${OS_NAME} (ID=${OS_ID}, ID_LIKE=${OS_LIKE})" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
verify_install
|
||||||
|
log "Done."
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
||||||
Reference in New Issue
Block a user