Last active
April 20, 2026 08:01
-
-
Save brahimmachkouri/35538d4dfb9c6baf297cc7b2096ce8e7 to your computer and use it in GitHub Desktop.
Ubuntu : Install Docker
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env bash | |
| set -euo pipefail | |
| # ============================================================ | |
| # Install Docker CE on Ubuntu (idempotent, rootless-friendly) | |
| # ============================================================ | |
| readonly LOG_FILE="/tmp/install-docker-$(date +%Y%m%d-%H%M%S).log" | |
| # ---------- Couleurs ---------- | |
| RED='\e[31m'; GREEN='\e[32m'; YELLOW='\e[33m'; BLUE='\e[34m'; CYAN='\e[36m' | |
| BOLD='\e[1m'; RESET='\e[0m' | |
| log() { echo -e "${BLUE}ℹ️ $*${RESET}"; } | |
| ok() { echo -e "${GREEN}✅ $*${RESET}"; } | |
| warn() { echo -e "${YELLOW}⚠️ $*${RESET}"; } | |
| err() { echo -e "${RED}❌ $*${RESET}" >&2; } | |
| die() { err "$@"; exit 1; } | |
| # ---------- Nettoyage ---------- | |
| cleanup() { | |
| [[ -n "${SUDO_LOOP_PID:-}" ]] && kill "$SUDO_LOOP_PID" 2>/dev/null || true | |
| } | |
| trap cleanup EXIT | |
| # ---------- Prérequis ---------- | |
| need_cmd() { | |
| command -v "$1" &>/dev/null || die "'$1' introuvable — installe-le avant de relancer ce script." | |
| } | |
| need_cmd sudo | |
| need_cmd curl | |
| sudo -v || die "Impossible d'obtenir les droits sudo." | |
| # Keep-alive sudo (renouvelle le ticket toutes les 50 s) | |
| ( while true; do sudo -n true 2>/dev/null; sleep 50; done ) & | |
| SUDO_LOOP_PID=$! | |
| # ---------- Détection codename ---------- | |
| get_codename() { | |
| if [[ -f /etc/os-release ]]; then | |
| # shellcheck source=/dev/null | |
| . /etc/os-release | |
| echo "${VERSION_CODENAME:-${UBUNTU_CODENAME:-}}" | |
| elif command -v lsb_release &>/dev/null; then | |
| lsb_release -cs | |
| fi | |
| } | |
| CODENAME="$(get_codename)" | |
| [[ -n "$CODENAME" ]] || die "Impossible de déterminer le codename Ubuntu." | |
| # ---------- Docker déjà installé ? ---------- | |
| if command -v docker &>/dev/null; then | |
| log "Docker déjà installé : $(docker --version)" | |
| if docker info &>/dev/null; then | |
| ok "Docker est fonctionnel sans sudo." | |
| else | |
| warn "Docker est installé mais inaccessible sans sudo." | |
| echo -e "${CYAN} 👉 Déconnecte-toi/reconnecte-toi ou lance : ${BOLD}newgrp docker${RESET}" | |
| fi | |
| exit 0 | |
| fi | |
| # ---------- Installation ---------- | |
| ARCH="$(dpkg --print-architecture)" | |
| log "Installation de Docker CE – Ubuntu ${CODENAME} (${ARCH})" | |
| sudo apt-get update -qq | |
| sudo apt-get install -yqq ca-certificates curl gnupg | |
| # Clé GPG du dépôt (idempotent grâce au rm -f) | |
| sudo install -m 0755 -d /etc/apt/keyrings | |
| sudo rm -f /etc/apt/keyrings/docker.gpg | |
| curl -fsSL https://download.docker.com/linux/ubuntu/gpg | | |
| sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg | |
| sudo chmod a+r /etc/apt/keyrings/docker.gpg | |
| # Source APT | |
| cat <<EOF | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null | |
| deb [arch=${ARCH} signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu ${CODENAME} stable | |
| EOF | |
| sudo apt-get update -qq | |
| sudo apt-get install -yqq \ | |
| docker-ce \ | |
| docker-ce-cli \ | |
| containerd.io \ | |
| docker-buildx-plugin \ | |
| docker-compose-plugin | |
| ok "Docker $(docker --version) installé." | |
| # ---------- Test de fonctionnement ---------- | |
| log "Test avec hello-world…" | |
| if sudo docker run --rm hello-world >> "$LOG_FILE" 2>&1; then | |
| ok "Docker fonctionne (détails dans ${LOG_FILE})." | |
| else | |
| err "Échec du test Docker. Consulte ${LOG_FILE} pour les détails." | |
| exit 1 | |
| fi | |
| # ---------- Groupe docker ---------- | |
| if ! getent group docker &>/dev/null; then | |
| log "Création du groupe docker" | |
| sudo groupadd docker | |
| fi | |
| if ! id -nG "$USER" | tr ' ' '\n' | grep -qx docker; then | |
| sudo usermod -aG docker "$USER" | |
| ok "${USER} ajouté au groupe docker." | |
| else | |
| log "${USER} est déjà dans le groupe docker." | |
| fi | |
| # ---------- Résumé ---------- | |
| echo | |
| if id -nG "$USER" | tr ' ' '\n' | grep -qx docker; then | |
| # Le groupe est là, mais pas forcément actif dans le shell courant | |
| if docker info &>/dev/null 2>&1; then | |
| ok "Docker est prêt — tu peux l'utiliser sans sudo." | |
| else | |
| warn "Le groupe docker est attribué mais pas encore actif dans ce shell." | |
| echo -e "${CYAN} 👉 Lance : ${BOLD}newgrp docker${RESET}" | |
| fi | |
| else | |
| warn "Tu dois te déconnecter/reconnecter pour utiliser Docker sans sudo." | |
| echo -e "${CYAN} 👉 Ou lance : ${BOLD}newgrp docker${RESET}" | |
| fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment