Files
debian-base/install-docker-ce.sh
2026-05-22 14:48:59 +02:00

212 lines
5.2 KiB
Bash
Executable File

#!/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 <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: ${VERSION_CODENAME}
Components: stable
Architectures: ${architecture}
Signed-By: /etc/apt/keyrings/docker.asc
EOF
}
# Installe Docker CE, ses plugins officiels et containerd depuis le depot Docker.
install_docker_packages() {
info "Installation de Docker CE."
apt-get update
apt-get install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin
}
# Active et demarre le service Docker.
enable_docker_service() {
info "Activation et demarrage du service Docker."
systemctl enable --now docker
}
# Valide que les utilisateurs demandes existent.
validate_docker_users() {
local target_user
for target_user in "$@"; do
if ! id "${target_user}" >/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 "$@"