#!/usr/bin/env bash # SPDX-License-Identifier: AGPL-3.0-only set -euo pipefail if [[ "${EUID}" -ne 0 ]]; then echo "Ce script doit etre lance en root." echo "Exemple: sudo $0" exit 1 fi # Affiche un message d'information standardise. info() { printf '[INFO] %s\n' "$*" } # Affiche un message d'erreur standardise sur stderr. error() { printf '[ERREUR] %s\n' "$*" >&2 } # Demande une confirmation explicite avant d'installer ou modifier des paquets. confirm() { local answer read -r -p "Installer Docker CE depuis le depot officiel Docker ? [y/N]: " answer [[ "${answer}" =~ ^[yY]$ ]] } # Verifie qu'une commande requise est disponible. require_command() { local command_name="$1" if ! command -v "${command_name}" >/dev/null 2>&1; then error "Commande introuvable: ${command_name}" exit 1 fi } # Charge les informations de version Debian depuis /etc/os-release. load_os_release() { if [[ ! -r /etc/os-release ]]; then error "Impossible de lire /etc/os-release." exit 1 fi # shellcheck disable=SC1091 . /etc/os-release if [[ "${ID:-}" != "debian" ]]; then error "Systeme non supporte: ${PRETTY_NAME:-inconnu}. Ce script cible Debian." exit 1 fi if [[ -z "${VERSION_CODENAME:-}" ]]; then error "VERSION_CODENAME est introuvable dans /etc/os-release." exit 1 fi } # Supprime les anciens paquets Docker non officiels qui peuvent entrer en conflit. remove_conflicting_packages() { local packages=( docker.io docker-compose docker-doc podman-docker containerd runc ) info "Suppression des anciens paquets Docker potentiellement conflictuels." apt-get remove -y "${packages[@]}" } # Installe les pre-requis necessaires au depot APT officiel Docker. install_prerequisites() { info "Installation des pre-requis APT." apt-get update apt-get install -y ca-certificates curl } # Ajoute la cle GPG officielle Docker et le fichier docker.sources. configure_docker_repository() { local architecture architecture="$(dpkg --print-architecture)" info "Configuration du depot officiel Docker pour Debian ${VERSION_CODENAME} (${architecture})." install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc chmod a+r /etc/apt/keyrings/docker.asc cat > /etc/apt/sources.list.d/docker.sources </dev/null 2>&1; then error "Utilisateur introuvable: ${target_user}" exit 1 fi info "Ajout de ${target_user} au groupe docker." usermod -aG docker "${target_user}" info "L'utilisateur devra ouvrir une nouvelle session pour utiliser Docker sans sudo." } # Affiche les versions installees pour confirmer l'installation. show_versions() { info "Versions installees:" docker --version docker compose version } # Orchestre l'installation complete de Docker CE. main() { local target_user="${1:-}" require_command apt-get require_command curl require_command dpkg require_command systemctl load_os_release echo "Installation Docker CE pour Debian ${VERSION_CODENAME}" echo echo "Ce script va:" echo " - supprimer les anciens paquets Docker conflictuels si presents" echo " - ajouter le depot officiel Docker" echo " - installer docker-ce, docker-ce-cli, containerd.io, buildx et compose" echo " - activer et demarrer le service docker" if [[ -n "${target_user}" ]]; then echo " - ajouter l'utilisateur ${target_user} au groupe docker" fi echo if ! confirm; then echo "Annule." exit 0 fi remove_conflicting_packages install_prerequisites configure_docker_repository install_docker_packages enable_docker_service add_user_to_docker_group "${target_user}" show_versions echo info "Installation terminee." } main "$@"