feat: refactor + debian ready + uninstall docker command
This commit is contained in:
parent
a1bcddb6e4
commit
5b8dbe3eea
@ -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 <<USAGE
|
||||
Usage:
|
||||
$0 # installs Docker (default)
|
||||
$0 --uninstall # uninstalls Docker (keeps /opt/docker)
|
||||
$0 -u --purge-repo # uninstalls Docker + removes APT repo and GPG key
|
||||
Logs: ${LOGFILE}
|
||||
USAGE
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
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 "Creating directory /etc/apt/keyrings"
|
||||
sleep 2
|
||||
sudo install -m 0755 -d /etc/apt/keyrings
|
||||
# ──────────────────────────────
|
||||
# OS Detection
|
||||
# ──────────────────────────────
|
||||
if [[ -r /etc/os-release ]]; then . /etc/os-release; else
|
||||
echo "Cannot detect distribution (missing /etc/os-release)." >&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 ""
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user