install.sh : question Docker absent (auto/manuel) via /dev/tty + flags --install-docker/--no-install-docker

This commit is contained in:
Hermes committed 2026-11-05 16:48:46 +01:00
1 parent 0744374e3c
commit 1664a8dbeb
2 files changed
+81 -4

No files matched your search

+26
View File
@@ -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
+55 -4
View File
@@ -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"