Skip to content

Instantly share code, notes, and snippets.

@brahimmachkouri
Last active April 20, 2026 08:01
Show Gist options
  • Select an option

  • Save brahimmachkouri/35538d4dfb9c6baf297cc7b2096ce8e7 to your computer and use it in GitHub Desktop.

Select an option

Save brahimmachkouri/35538d4dfb9c6baf297cc7b2096ce8e7 to your computer and use it in GitHub Desktop.
Ubuntu : Install Docker
#!/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