From 5b8dbe3eea7783b4d2e860d8440b6b73183c7304 Mon Sep 17 00:00:00 2001 From: guillaume Date: Fri, 10 Oct 2025 23:51:22 +0200 Subject: [PATCH] feat: refactor + debian ready + uninstall docker command --- install/docker.sh | 299 ++++++++++++++++++++++++---------------------- 1 file changed, 154 insertions(+), 145 deletions(-) diff --git a/install/docker.sh b/install/docker.sh index f871c99..1514c59 100644 --- a/install/docker.sh +++ b/install/docker.sh @@ -1,163 +1,172 @@ -#!/bin/bash +#!/usr/bin/env bash +set -euo pipefail -# Define colors -GREEN="\e[32m" -CYAN="\e[36m" -RESET="\e[0m" +# ────────────────────────────── +# Config & helpers +# ────────────────────────────── +LOGFILE="${LOGFILE:-/var/log/docker-install.log}" +: > "$LOGFILE" || { echo "Cannot write $LOGFILE (need root?)"; exit 1; } -# ASCII art -docker="${CYAN} - =++++ - *#### - -==== - .****:-****.=***+ - :####-=####.*#### : - .====.:==== -==== -##= - +***=.****:-****.=***+ ****= ####* - ####*:####-=####.*#### ####+ *####*###*= - ====-.====.:==== -==== ====: -########*. - -+++++++++++++++++++++++++++++++**#####==-: - =#####################################: - :###################################*. - *#################################= - .*##############################+. - +##########################*- - .=*####################+-. +if [[ ${EUID:-$(id -u)} -ne 0 ]]; then SUDO="sudo"; else SUDO=""; fi +TARGET_USER="${SUDO_USER:-$USER}" + +GREEN=$(tput setaf 2 || true); CYAN=$(tput setaf 6 || true); RESET=$(tput sgr0 || true) +BOLD=$(tput bold || true); NORM=$(tput sgr0 || true) + +log() { echo -e "${CYAN}$*${RESET}" | tee -a "$LOGFILE"; } +ok() { echo -e "${GREEN}$*${RESET}" | tee -a "$LOGFILE"; } +run() { eval "$@" >>"$LOGFILE" 2>&1; } + +ascii=" +${CYAN} + =++++ + *#### + -==== + .****:-****.=***+ + :####-=####.*#### : + .====.:==== -==== -##= + +***=.****:-****.=***+ ****= ####* + ####*:####-=####.*#### ####+ *####*###*= + ====-.====.:==== -==== ====: -########*. + -+++++++++++++++++++++++++++++++**#####==-: + =#####################################: + :###################################*. + *#################################= + .*##############################+. + +##########################*- + .=*####################+-. .-=+**######**+=-:. ${RESET}" clear +echo -e "$ascii" -echo -e "${docker}" -echo -e "${CYAN}Step 1: Add Docker's official GPG key${RESET}" -echo -e "Updating package list" -sleep 2 -sudo apt-get update > .temp.log +# ────────────────────────────── +# Arguments +# ────────────────────────────── +ACTION="install" # install | uninstall +PURGE_REPO="no" # yes | no -clear -echo -e "${docker}" -echo -e "${CYAN}Step 1: Add Docker's official GPG key${RESET}" -echo -e "${GREEN}Updating package list${RESET}" -echo -e "Installing required packages: ca-certificates, curl, gnupg" -sleep 2 -sudo apt-get install -y ca-certificates curl gnupg > .temp.log +for arg in "${@:-}"; do + case "$arg" in + --uninstall|-u) ACTION="uninstall" ;; + --purge-repo) PURGE_REPO="yes" ;; + --help|-h) + cat <&2; exit 1; fi -clear -echo -e "${docker}" -echo -e "${CYAN}Step 1: Add Docker's official GPG key${RESET}" -echo -e "${GREEN}Updating package list${RESET}" -echo -e "${GREEN}Installing required packages: ca-certificates, curl, gnupg${RESET}" -echo -e "${GREEN}Creating directory /etc/apt/keyrings${RESET}" -echo -e "Downloading Docker's GPG key and saving it to /etc/apt/keyrings/docker.gpg" -sleep 2 -sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc -sudo chmod a+r /etc/apt/keyrings/docker.asc +case "${ID:-}" in + ubuntu) BASE_URL="https://download.docker.com/linux/ubuntu" ;; + debian) BASE_URL="https://download.docker.com/linux/debian" ;; + *) echo "Unsupported distribution: ${ID:-unknown}. (Ubuntu/Debian only)"; exit 1 ;; +esac -clear -echo -e "${docker}" -echo -e "${CYAN}Step 1: Add Docker's official GPG key${RESET}" -echo -e "${GREEN}Updating package list${RESET}" -echo -e "${GREEN}Installing required packages: ca-certificates, curl, gnupg${RESET}" -echo -e "${GREEN}Creating directory /etc/apt/keyrings${RESET}" -echo -e "${GREEN}Downloading Docker's GPG key and saving it to /etc/apt/keyrings/docker.gpg${RESET}" -echo -e "${CYAN}Step 2: Add the repository to Apt sources${RESET}" -echo -e "Adding the Docker repository to Apt sources" -sleep 2 -echo \ - "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ - $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ - sudo tee /etc/apt/sources.list.d/docker.list > /dev/null +CODENAME="${VERSION_CODENAME:-}" +if [[ -z "$CODENAME" ]] && command -v lsb_release >/dev/null 2>&1; then CODENAME="$(lsb_release -cs)"; fi +if [[ -z "$CODENAME" ]]; then echo "Unable to determine codename (VERSION_CODENAME)." >&2; exit 1; fi -clear -echo -e "${docker}" -echo -e "${CYAN}Step 1: Add Docker's official GPG key${RESET}" -echo -e "${GREEN}Updating package list${RESET}" -echo -e "${GREEN}Installing required packages: ca-certificates, curl, gnupg${RESET}" -echo -e "${GREEN}Creating directory /etc/apt/keyrings${RESET}" -echo -e "${GREEN}Downloading Docker's GPG key and saving it to /etc/apt/keyrings/docker.gpg${RESET}" -echo -e "${CYAN}Step 2: Add the repository to Apt sources${RESET}" -echo -e "${GREEN}Adding the Docker repository to Apt sources${RESET}" -echo -e "Updating package list with Docker repository" -sleep 2 -sudo apt-get update > .temp.log +ARCH="$(dpkg --print-architecture)" +PRETTY="${PRETTY_NAME:-$ID}" +LISTFILE="/etc/apt/sources.list.d/docker.list" +KEYFILE="/etc/apt/keyrings/docker.asc" +REPO_LINE="deb [arch=${ARCH} signed-by=${KEYFILE}] ${BASE_URL} ${CODENAME} stable" -clear -echo -e "${docker}" -echo -e "${CYAN}Step 1: Add Docker's official GPG key${RESET}" -echo -e "${GREEN}Updating package list${RESET}" -echo -e "${GREEN}Installing required packages: ca-certificates, curl, gnupg${RESET}" -echo -e "${GREEN}Creating directory /etc/apt/keyrings${RESET}" -echo -e "${GREEN}Downloading Docker's GPG key and saving it to /etc/apt/keyrings/docker.gpg${RESET}" -echo -e "${CYAN}Step 2: Add the repository to Apt sources${RESET}" -echo -e "${GREEN}Adding the Docker repository to Apt sources${RESET}" -echo -e "${GREEN}Updating package list with Docker repository${RESET}" -echo -e "${CYAN}Step 3: Install Docker${RESET}" -echo -e "Installing Docker and related packages" -sleep 2 -sudo NEEDRESTART_MODE=a apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin > .temp.log +echo -e "Mode: ${CYAN}${BOLD}${ACTION^^}${RESET} | ${BOLD}${PRETTY}${RESET} (${BOLD}${CODENAME}${RESET}), arch=${CYAN}${ARCH}${RESET}" +echo -e "Detailed logs: ${CYAN}${LOGFILE}${RESET}\n" -clear -echo -e "${docker}" -echo -e "${CYAN}Step 1: Add Docker's official GPG key${RESET}" -echo -e "${GREEN}Updating package list${RESET}" -echo -e "${GREEN}Installing required packages: ca-certificates, curl, gnupg${RESET}" -echo -e "${GREEN}Creating directory /etc/apt/keyrings${RESET}" -echo -e "${GREEN}Downloading Docker's GPG key and saving it to /etc/apt/keyrings/docker.gpg${RESET}" -echo -e "${CYAN}Step 2: Add the repository to Apt sources${RESET}" -echo -e "${GREEN}Adding the Docker repository to Apt sources${RESET}" -echo -e "${GREEN}Updating package list with Docker repository${RESET}" -echo -e "${CYAN}Step 3: Install Docker${RESET}" -echo -e "${GREEN}Installing Docker and related packages${RESET}" -echo -e "Added $USER to Docker group" -sleep 2 -sudo adduser $USER docker +# ────────────────────────────── +# INSTALL Functions +# ────────────────────────────── +install_docker() { + echo -e "${CYAN}1) Installing prerequisites (ca-certificates, curl, gnupg, acl)${RESET}" + run "$SUDO apt-get update -y" + run "$SUDO apt-get install -y ca-certificates curl gnupg acl" -clear -echo -e "${docker}" -echo -e "${CYAN}Step 1: Add Docker's official GPG key${RESET}" -echo -e "${GREEN}Updating package list${RESET}" -echo -e "${GREEN}Installing required packages: ca-certificates, curl, gnupg${RESET}" -echo -e "${GREEN}Creating directory /etc/apt/keyrings${RESET}" -echo -e "${GREEN}Downloading Docker's GPG key and saving it to /etc/apt/keyrings/docker.gpg${RESET}" -echo -e "${CYAN}Step 2: Add the repository to Apt sources${RESET}" -echo -e "${GREEN}Adding the Docker repository to Apt sources${RESET}" -echo -e "${GREEN}Updating package list with Docker repository${RESET}" -echo -e "${CYAN}Step 3: Install Docker${RESET}" -echo -e "${GREEN}Installing Docker and related packages${RESET}" -echo -e "${GREEN}Added $USER to Docker group${RESET}" -echo -e "${CYAN}Step 4: Verify Docker Installation${RESET}" -echo -e "Running a test container to verify Docker installation" -sudo docker run hello-world -sleep 2 + echo -e "${CYAN}2) Preparing Docker keyring${RESET}" + run "$SUDO install -m 0755 -d /etc/apt/keyrings" + if [[ ! -f "$KEYFILE" ]]; then + run "$SUDO curl -fsSL ${BASE_URL}/gpg -o ${KEYFILE}" + run "$SUDO chmod a+r ${KEYFILE}" + fi -clear -echo -e "${docker}" -echo -e "${CYAN}Step 1: Add Docker's official GPG key${RESET}" -echo -e "${GREEN}Updating package list${RESET}" -echo -e "${GREEN}Installing required packages: ca-certificates, curl, gnupg${RESET}" -echo -e "${GREEN}Creating directory /etc/apt/keyrings${RESET}" -echo -e "${GREEN}Downloading Docker's GPG key and saving it to /etc/apt/keyrings/docker.gpg${RESET}" -echo -e "${CYAN}Step 2: Add the repository to Apt sources${RESET}" -echo -e "${GREEN}Adding the Docker repository to Apt sources${RESET}" -echo -e "${GREEN}Updating package list with Docker repository${RESET}" -echo -e "${CYAN}Step 3: Install Docker${RESET}" -echo -e "${GREEN}Installing Docker and related packages${RESET}" -echo -e "${GREEN}Added $USER to Docker group${RESET}" -echo -e "${CYAN}Step 4: Verify Docker Installation${RESET}" -echo -e "${GREEN}Running a test container to verify Docker installation${RESET}" -sleep 1 + echo -e "${CYAN}3) Adding Docker APT repository (stable)${RESET}" + echo "$REPO_LINE" | $SUDO tee "$LISTFILE" >/dev/null + run "$SUDO apt-get update -y" -sudo rm .temp.log + echo -e "${CYAN}4) Installing Docker Engine + Buildx + Compose${RESET}" + run "$SUDO apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin" -echo "" -echo -e "${CYAN}Docker installation and verification complete.${RESET}" -echo "" \ No newline at end of file + echo -e "${CYAN}5) Enabling Docker service${RESET}" + run "$SUDO systemctl enable --now docker" + + echo -e "${CYAN}6) Managing docker group and adding user${RESET}" + if ! getent group docker >/dev/null 2>&1; then run "$SUDO groupadd docker"; fi + if ! id -nG "$TARGET_USER" | grep -qw docker; then run "$SUDO usermod -aG docker '$TARGET_USER'"; fi + + echo -e "${CYAN}7) Creating and setting permissions for /opt/docker${RESET}" + run "$SUDO mkdir -p /opt/docker" + run "$SUDO chown root:docker /opt/docker" + run "$SUDO chmod 2770 /opt/docker" + run "$SUDO setfacl -R -m g:docker:rwx /opt/docker" + run "$SUDO setfacl -R -d -m g:docker:rwx /opt/docker" + + echo -e "${CYAN}8) Verifying installation (hello-world)${RESET}" + run "$SUDO docker run --rm hello-world" + + echo ""; ok "✅ Docker installation and verification completed." + echo -e "Log out and log back in (${BOLD}logout/login${NORM}) to use Docker without sudo." +} + +# ────────────────────────────── +# UNINSTALL Functions +# ────────────────────────────── +uninstall_docker() { + echo -e "${CYAN}1) Stopping Docker service (if running)${RESET}" + if $SUDO systemctl is-active --quiet docker; then run "$SUDO systemctl stop docker"; fi + run "$SUDO systemctl disable docker || true" + + echo -e "${CYAN}2) Removing Docker packages${RESET}" + PKGS="docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras docker-scan-plugin docker.io" + run "$SUDO DEBIAN_FRONTEND=noninteractive apt-get purge -y $PKGS || true" + echo -e "${CYAN}3) Cleaning up dependencies${RESET}" + run "$SUDO apt-get autoremove -y --purge || true" + + if [[ "$PURGE_REPO" == "yes" ]]; then + echo -e "${CYAN}4) Removing Docker APT repo and GPG key${RESET}" + run "$SUDO rm -f '$LISTFILE' || true" + run "$SUDO rm -f '$KEYFILE' || true" + run "$SUDO apt-get update -y || true" + STEP_NEXT=5 + else + STEP_NEXT=4 + fi + + echo -e "${CYAN}${STEP_NEXT}) Keeping local data and /opt/docker (no deletion)${RESET}" + echo -e "${CYAN} → /opt/docker, /var/lib/docker, and /var/lib/containerd are NOT touched.${RESET}" + + echo ""; ok "🧹 Docker uninstallation complete (packages removed, data kept)." + echo -e "You can manually delete ${BOLD}/var/lib/docker${NORM} and ${BOLD}/var/lib/containerd${NORM} if you want a full cleanup." +} + +# ────────────────────────────── +# Main +# ────────────────────────────── +case "$ACTION" in + install) install_docker ;; + uninstall) uninstall_docker ;; +esac