#!/usr/bin/env bash set -euo pipefail # Installs Docker Engine + Docker Compose plugin on Ubuntu/Debian or RHEL-like (CentOS/Rocky/Alma). # Adds a user to the "docker" group (so they can run docker without sudo). # # Usage: # sudo ./install-docker.sh # sudo ./install-docker.sh --user username # sudo ./install-docker.sh --user username --no-docker-group # # Notes: # - After adding a user to docker group, they must re-login (or run: newgrp docker). TARGET_USER="" ADD_TO_DOCKER_GROUP="1" usage() { cat <<'EOF' Usage: install-docker.sh [--user ] [--no-docker-group] Options: --user Add this user to docker group (default: current sudo user if set) --no-docker-group Do not add any user to docker group -h, --help Show help EOF } while [[ $# -gt 0 ]]; do case "$1" in --user) [[ $# -ge 2 ]] || { echo "Missing value for --user" >&2; usage; exit 2; } TARGET_USER="$2" shift 2 ;; --no-docker-group) ADD_TO_DOCKER_GROUP="0" shift ;; -h|--help) usage exit 0 ;; *) echo "Unknown argument: $1" >&2 usage exit 2 ;; esac done if [[ "${EUID}" -ne 0 ]]; then echo "Run as root (sudo)." >&2 exit 1 fi # Default user: the sudo invoker (if any), else empty if [[ -z "${TARGET_USER}" && -n "${SUDO_USER:-}" && "${SUDO_USER}" != "root" ]]; then TARGET_USER="${SUDO_USER}" fi if command -v docker >/dev/null 2>&1; then echo "Docker already installed: $(docker --version || true)" fi detect_os() { if [[ -r /etc/os-release ]]; then # shellcheck disable=SC1091 . /etc/os-release echo "${ID:-unknown}" "${VERSION_CODENAME:-}" "${VERSION_ID:-}" else echo "unknown" "" "" fi } ID="" CODENAME="" VERSION_ID="" read -r ID CODENAME VERSION_ID < <(detect_os) echo "Detected OS: ID=${ID} CODENAME=${CODENAME} VERSION_ID=${VERSION_ID}" setup_daemon_json() { mkdir -p /etc/docker if [[ ! -f /etc/docker/daemon.json ]]; then cat > /etc/docker/daemon.json <<'JSON' { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } JSON echo "Created /etc/docker/daemon.json (log rotation)." else echo "/etc/docker/daemon.json already exists; leaving as-is." fi } install_debian_ubuntu() { apt-get update apt-get -y install ca-certificates curl gnupg install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/${ID}/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg chmod a+r /etc/apt/keyrings/docker.gpg ARCH="$(dpkg --print-architecture)" CODENAME_LOCAL="${CODENAME}" if [[ -z "${CODENAME_LOCAL}" ]]; then CODENAME_LOCAL="$(. /etc/os-release && echo "${VERSION_CODENAME}")" fi cat > /etc/apt/sources.list.d/docker.list </dev/null 2>&1; then PM="dnf" else PM="yum" fi $PM -y install yum-utils ca-certificates curl # Repo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo $PM -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin } case "${ID}" in ubuntu|debian) install_debian_ubuntu ;; rhel|centos|fedora|rocky|almalinux) install_rhel_like ;; *) echo "Unsupported OS ID='${ID}'. Supported: ubuntu, debian, centos/rhel/rocky/almalinux/fedora" >&2 exit 1 ;; esac setup_daemon_json systemctl enable docker systemctl restart docker # docker group/user permissions if ! getent group docker >/dev/null; then groupadd docker || true fi if [[ "${ADD_TO_DOCKER_GROUP}" == "1" && -n "${TARGET_USER}" ]]; then if id "${TARGET_USER}" >/dev/null 2>&1; then usermod -aG docker "${TARGET_USER}" echo "Added user '${TARGET_USER}' to group 'docker'." else echo "User '${TARGET_USER}' not found; skipping docker group assignment." >&2 fi fi echo echo "=== Installed ===" docker --version docker compose version echo echo "=== Service status ===" systemctl --no-pager --full status docker | sed -n '1,25p' || true echo if [[ "${ADD_TO_DOCKER_GROUP}" == "1" && -n "${TARGET_USER}" ]]; then echo "IMPORTANT: user '${TARGET_USER}' must re-login for docker group to apply." echo "Quick test after relogin: docker run --rm hello-world" else echo "To use docker without sudo: add a user to docker group:" echo " sudo usermod -aG docker && newgrp docker" fi