#!/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]$ ]] } # Demande les utilisateurs a ajouter au groupe docker. ask_docker_users() { local users_input read -r -p "Utilisateurs a ajouter au groupe docker (separes par des espaces, laisser vide pour aucun): " users_input printf '%s\n' "${users_input}" } # 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 done } # Ajoute les utilisateurs demandes au groupe docker. add_users_to_docker_group() { local target_user for target_user in "$@"; do info "Ajout de ${target_user} au groupe docker." usermod -aG docker "${target_user}" done if [[ "$#" -gt 0 ]]; then info "Les utilisateurs ajoutes devront ouvrir une nouvelle session pour utiliser Docker sans sudo." fi } # 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 docker_users=("$@") local users_input require_command apt-get require_command curl require_command dpkg require_command systemctl load_os_release if [[ "${#docker_users[@]}" -eq 0 ]]; then users_input="$(ask_docker_users)" if [[ -n "${users_input}" ]]; then read -r -a docker_users <<< "${users_input}" fi fi validate_docker_users "${docker_users[@]}" 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 [[ "${#docker_users[@]}" -gt 0 ]]; then echo " - ajouter les utilisateurs suivants au groupe docker: ${docker_users[*]}" 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_users_to_docker_group "${docker_users[@]}" show_versions echo info "Installation terminee." } main "$@"