From 1664a8dbeb0f74d2962a8f107b2d4ae2ba8f1170 Mon Sep 17 00:00:00 2001 From: Hermes Date: Thu, 5 Nov 2026 16:48:46 +0100 Subject: [PATCH] install.sh : question Docker absent (auto/manuel) via /dev/tty + flags --install-docker/--no-install-docker --- README.md | 26 ++++++++++++++++++++++++ install.sh | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 81 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 70f85ed..cc4988e 100644 --- a/README.md +++ b/README.md @@ -46,8 +46,34 @@ curl -fsSL .../install.sh | sudo bash -s -- --image git.hilel.fr/hamriou/streamb | `--from-ssh HOST` | `ssh HOST 'docker save …' \| docker load` | | `--image REPO:TAG` | `docker pull` puis tag local | | `--wait N` | attente max du health check (défaut 90 s) | +| `--install-docker` | installer Docker automatiquement si absent, sans poser la question | +| `--no-install-docker` | ne jamais installer Docker : quitte avec la commande à lancer | | `--dry-run` | affiche les actions sans rien modifier | +## Docker absent + +Par défaut l'installeur **pose la question** : + +``` + Docker n'est pas présent sur cette machine. + + 1) Installer Docker automatiquement (script officiel get.docker.com) + 2) Quitter et installer Docker manuellement + + Choix [1/2] : +``` + +Le choix 1 lance `curl -fsSL https://get.docker.com | sh` puis revérifie le +démon et le greffon `compose` ; le choix 2 quitte en affichant la commande. + +Deux détails qui comptent : + +- la question est lue sur **`/dev/tty`**, pas sur stdin — avec `curl … | bash`, + stdin contient le script et un `read` naïf consommerait ses octets ; +- **sans terminal interactif** (cron, CI, `ssh` sans `-t`), l'installeur ne reste + jamais bloqué : il sort avec la commande à lancer. Utilise alors + `--install-docker` ou `--no-install-docker` pour trancher à l'avance. + ## Mise à jour ```bash diff --git a/install.sh b/install.sh index 7037a6b..c82eca8 100755 --- a/install.sh +++ b/install.sh @@ -26,6 +26,7 @@ SRC_REF="" SRC_SSH="" DRY=0 WAIT="${WAIT:-90}" +DOCKER_MODE="${DOCKER_MODE:-ask}" # ask | auto | manual log() { printf '\033[1;34m==>\033[0m %s\n' "$*"; } ok() { printf '\033[1;32m ok\033[0m %s\n' "$*"; } @@ -42,6 +43,8 @@ streambox — installeur --tar FICHIER charger l'image depuis une archive (docker load), chemin ou URL --from-ssh HOST charger l'image depuis HOST (ssh HOST 'docker save ...' | docker load) --wait SECONDES attente max du health check (défaut: 90) + --install-docker installer Docker automatiquement si absent (sans question) + --no-install-docker ne jamais installer Docker (quitte avec la commande à lancer) --dry-run afficher les actions sans rien modifier -h, --help cette aide @@ -58,6 +61,8 @@ while [ $# -gt 0 ]; do --tar) SRC_TAR="${2:?}"; shift 2 ;; --from-ssh) SRC_SSH="${2:?}"; shift 2 ;; --wait) WAIT="${2:?}"; shift 2 ;; + --install-docker) DOCKER_MODE=auto; shift ;; + --no-install-docker) DOCKER_MODE=manual; shift ;; --dry-run) DRY=1; shift ;; -h|--help) usage; exit 0 ;; *) die "argument inconnu: $1 (voir --help)" ;; @@ -69,13 +74,59 @@ COMPOSE="$INSTALL_DIR/docker-compose.yml" # ----------------------------------------------------------------- 1. prérequis log "Prérequis" -command -v docker >/dev/null || die "docker absent" -command -v curl >/dev/null || die "curl absent" + +COMMANDE_DOCKER="curl -fsSL https://get.docker.com | sudo sh" + +installer_docker() { + log "Installation automatique de Docker (script officiel get.docker.com)" + curl -fsSL https://get.docker.com | sh || die "l'installation de Docker a échoué" + hash -r + command -v docker >/dev/null 2>&1 || die "docker reste absent après l'installation" + docker info >/dev/null 2>&1 || die "Docker installé mais le démon ne répond pas (systemctl start docker)" + docker compose version >/dev/null 2>&1 || die "docker compose v2 absent après l'installation" + ok "$(docker --version | cut -d, -f1)" +} + +# Demande quoi faire quand Docker (ou son greffon compose) manque. +# Lit sur /dev/tty : avec `curl | bash`, stdin contient le script, pas le clavier. +resoudre_docker() { + local raison="$1" + warn "$raison" + case "$DOCKER_MODE" in + auto) installer_docker; return 0 ;; + manual) die "installation manuelle demandée. Lance : $COMMANDE_DOCKER" ;; + esac + if ! ( : > /dev/tty ) 2>/dev/null; then + die "pas de terminal interactif. Relance avec --install-docker, ou lance : $COMMANDE_DOCKER" + fi + { + printf '\n %s\n\n' "$raison" + printf ' 1) Installer Docker automatiquement (script officiel get.docker.com)\n' + printf ' 2) Quitter et installer Docker manuellement\n\n' + printf ' Choix [1/2] : ' + } > /dev/tty + local rep="" + read -r rep < /dev/tty || rep="2" + case "$rep" in + 1) installer_docker ;; + *) printf '\n Installation manuelle :\n %s\n\n' "$COMMANDE_DOCKER" > /dev/tty + die "arrêt à la demande de l'utilisateur" ;; + esac +} + +command -v curl >/dev/null 2>&1 || die "curl absent (apt-get install -y curl)" + if [ "$DRY" = 0 ]; then + if ! command -v docker >/dev/null 2>&1; then + resoudre_docker "Docker n'est pas présent sur cette machine." + elif ! docker compose version >/dev/null 2>&1; then + resoudre_docker "Le greffon 'docker compose' (v2) est absent." + fi docker info >/dev/null 2>&1 || die "docker injoignable (droits ? lance avec sudo)" - docker compose version >/dev/null 2>&1 || die "docker compose v2 absent" + ok "docker + compose v2" +else + ok "prérequis non vérifiés (dry-run)" fi -ok "docker + compose v2" # --------------------------------------------------------- 2. répertoire + compose log "Répertoire $INSTALL_DIR"