install.sh : question Docker absent (auto/manuel) via /dev/tty + flags --install-docker/--no-install-docker
This commit is contained in:
1 parent
0744374e3c
commit
1664a8dbeb
2 files changed
+82
-5
No files matched your search
@@ -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
|
||||
|
||||
+56
-5
@@ -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"
|
||||
if [ "$DRY" = 0 ]; then
|
||||
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"
|
||||
|
||||
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)"
|
||||
ok "docker + compose v2"
|
||||
else
|
||||
ok "prérequis non vérifiés (dry-run)"
|
||||
fi
|
||||
|
||||
# --------------------------------------------------------- 2. répertoire + compose
|
||||
log "Répertoire $INSTALL_DIR"
|
||||
|
||||
Reference in new issue
Block a user