Help us shape the future of Go! Take the 2026 Go Developer Survey

telemach-plugin-docker

module
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 15, 2026 License: Apache-2.0

README

TELEMACH PLUGIN DOCKER

TELEMACH est un plugin pédagogique pour Docker : quand une commande docker ou docker compose échoue, il t'explique en français ce qui s'est passé, le concept Docker en jeu, la cause probable et comment corriger, avec une sortie largement colorée.

$ docker run -p 8080:80 nginx:1.30-alpine
docker: Error response from daemon: … Bind for 0.0.0.0:8080 failed: port is already allocated

✖ Le port 8080 de ta machine est déjà utilisé.

📘 Concept — port publishing
   L'option « -p PORT_MACHINE:PORT_CONTENEUR » relie un port de ta machine à un
   port du conteneur. Un port de la machine ne peut être relié qu'une seule fois.

🔎 Cause probable
   Un autre conteneur (ou un autre programme de ta machine) écoute déjà sur le port 8080.

💡 Corrections
   1. Voir quel conteneur publie déjà ce port.
      docker ps --filter publish=8080
   2. Publier le conteneur sur un autre port de ta machine.
      docker run -p 8081:80 nginx:1.30-alpine

➜ Pour aller plus loin : docker telemach deepen

Le projet

Quand on apprend Docker, les erreurs arrivent vite, et elles sont écrites en anglais technique : Bind for 0.0.0.0:8080 failed, pull access denied, mapping values are not allowed in this context… Le message dit ce qui a échoué, rarement pourquoi, et encore moins ce qu'il faut comprendre pour ne plus refaire l'erreur.

TELEMACH transforme chaque erreur en petite leçon. Le nom vient de Télémaque, le fils d'Ulysse, guidé par Mentor dans l'Odyssée : le plugin joue ce rôle de mentor, au moment précis où tu en as besoin, dans ton propre terminal.

Il s'adresse aux personnes qui débutent ou progressent avec Docker : étudiants, développeurs qui découvrent les conteneurs, formateurs qui veulent un compagnon pour leurs travaux pratiques.

Le concept

Une erreur = une leçon en quatre temps

Chaque explication suit toujours la même structure, pour que l'apprenant prenne l'habitude de raisonner ainsi :

Bloc Rôle
✖ Résumé ce qui s'est passé, en une phrase
📘 Concept la notion Docker en jeu (image, conteneur, port, volume, réseau…), définie simplement
🔎 Cause probable pourquoi c'est arrivé ici
💡 Corrections ce que tu peux faire, avec la commande prête à copier
⚠ Anti-pattern la « solution rapide » à éviter, et pourquoi (chmod 666, rm -f…)
➜ Pour aller plus loin docker telemach deepen : le concept détaillé, un exemple, un exercice

Si la même erreur se répète dans les 10 minutes, TELEMACH n'affiche qu'un rappel court ; docker telemach last réaffiche alors l'explication complète.

Le message Docker d'origine reste affiché, atténué, avec les éléments importants (port, image, chemin) surlignés : on apprend aussi à lire soi-même les erreurs Docker.

Trois principes
  • Ne jamais inventer. Une erreur inconnue est présentée comme telle, avec des pistes et un lien vers la documentation officielle, mais sans cause supposée.
  • Ne jamais agir à ta place. TELEMACH propose, tu décides : il n'exécute aucune commande et ne modifie aucun fichier.
  • Enseigner les bonnes pratiques. Les exemples évitent root, --privileged et les secrets écrits en clair ; une solution dangereuse est toujours signalée comme telle.
Comment ça marche
flowchart LR
    A["Tu tapes<br/>docker …"] --> B["Fonction shell<br/>docker"]
    B --> C["Vrai docker<br/>(sortie inchangée)"]
    C -- "échec : code de sortie<br/>+ copie de stderr" --> D["docker-telemach explain"]
    D --> E["Nettoyage et<br/>masquage des secrets"]
    E --> F{"docker compose ?"}
    F -- oui --> G["Analyse des<br/>fichiers Compose"]
    F -- non --> H["Catalogue<br/>d'erreurs"]
    G --> I["Explication colorée<br/>en français"]
    H --> I
  1. Capture. shell-init définit une fonction docker dans ton shell. Elle lance le vrai docker sans toucher à son entrée ni à sa sortie standard, et garde une copie de la sortie d'erreur dans un fichier temporaire privé (0600), supprimé juste après.
  2. Nettoyage. Le texte capturé est traité comme non fiable : les séquences de contrôle du terminal sont neutralisées et les secrets (mots de passe, jetons, user:motdepasse@) sont masqués avant tout usage.
  3. Diagnostic. Le catalogue (fichiers YAML en français, embarqués dans le binaire) reconnaît l'erreur grâce à des motifs. Le code de sortie indique si l'erreur vient de Docker (125) ou du programme du conteneur (126, 127, 137, 143 et les autres codes).
  4. Compose. Pour docker compose, l'analyseur relit les fichiers Compose en lecture seule, avec le parseur officiel compose-go, pour pointer le fichier, la ligne et la clé exacts.
  5. Rendu. L'explication est affichée sur la sortie d'erreur, avec un code couleur par bloc et la coloration syntaxique des commandes et des extraits YAML.
Vérifier un fichier Compose avant de le lancer
$ docker telemach check
✖ Problème 1/1 — compose.yaml:4:5
   service « web », clé « services.web.port »
   la clé « port » n'existe pas à cet endroit — tu voulais sans doute écrire « ports »

     1 │ services:
     2 │   web:
     3 │     image: nginx:1.30-alpine
   ➤ 4 │     port:
             ^
     5 │       - "8080:80"

   💡 Version corrigée
     4 │     ports:

L'analyse détecte : fichier introuvable ou illisible, tabulations, syntaxe YAML, clés en double ou inconnues (avec la clé probable), types de valeurs incorrects, services, réseaux ou volumes non déclarés, dépendances en boucle, variables non définies et secrets écrits en clair.

Installation

Prérequis
Outil Version Vérification
Docker Engine ou Docker Desktop avec le plugin Compose v2 docker version et docker compose version
Shell bash ou zsh (Linux, macOS, WSL2) echo $SHELL
curl toute version récente curl --version

Go n'est pas nécessaire, sauf pour compiler depuis les sources. Windows natif (PowerShell) n'est pas pris en charge ; sous Windows, utilise WSL2.

1. Installer le plugin
Depuis une Release (recommandé)

Chaque version publie, sur la page des Releases, un binaire par système (Linux, macOS) et par processeur (amd64, arm64), avec un fichier de sommes de contrôle signé. Télécharge en ligne de commande plutôt qu'avec un navigateur : sous macOS, un fichier téléchargé par un navigateur peut être bloqué au premier lancement.

Linux et WSL2 :

VERSION=0.2.0
ARCH=$(uname -m); case "$ARCH" in x86_64) ARCH=amd64 ;; aarch64|arm64) ARCH=arm64 ;; esac
FICHIER=docker-telemach_${VERSION}_linux_${ARCH}
curl -fsSLO "https://github.com/aboigues/telemach-plugin-docker/releases/download/v${VERSION}/${FICHIER}"
curl -fsSLO "https://github.com/aboigues/telemach-plugin-docker/releases/download/v${VERSION}/checksums.txt"
sha256sum --check --ignore-missing checksums.txt
mkdir -p ~/.docker/cli-plugins
install -m 0755 "$FICHIER" ~/.docker/cli-plugins/docker-telemach
docker telemach --version

macOS :

VERSION=0.2.0
ARCH=$(uname -m); case "$ARCH" in x86_64) ARCH=amd64 ;; aarch64|arm64) ARCH=arm64 ;; esac
FICHIER=docker-telemach_${VERSION}_darwin_${ARCH}
curl -fsSLO "https://github.com/aboigues/telemach-plugin-docker/releases/download/v${VERSION}/${FICHIER}"
curl -fsSLO "https://github.com/aboigues/telemach-plugin-docker/releases/download/v${VERSION}/checksums.txt"
shasum -a 256 --check --ignore-missing checksums.txt
mkdir -p ~/.docker/cli-plugins
install -m 0755 "$FICHIER" ~/.docker/cli-plugins/docker-telemach
docker telemach --version

La ligne --check doit afficher OK : la somme du fichier téléchargé correspond à celle publiée. Si elle affiche FAILED, n'installe pas ce fichier (téléchargement corrompu ou altéré) : supprime-le et recommence.

Aller plus loin : vérifier la signature et la provenance

Le fichier checksums.txt est signé sans clé privée à conserver (signature « keyless » Sigstore) : la signature prouve qu'il a été produit par le workflow de publication officiel du dépôt. Avec cosign v3 :

curl -fsSLO "https://github.com/aboigues/telemach-plugin-docker/releases/download/v${VERSION}/checksums.txt.sigstore.json"
cosign verify-blob \
  --bundle checksums.txt.sigstore.json \
  --certificate-identity-regexp '^https://github\.com/aboigues/telemach-plugin-docker/\.github/workflows/release\.yml@refs/tags/v' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  checksums.txt

Chaque binaire a aussi une attestation de provenance (SLSA) qui le relie au commit et au workflow qui l'ont construit. Avec la CLI GitHub :

gh attestation verify "$FICHIER" --repo aboigues/telemach-plugin-docker
Avec Docker seulement

L'image officielle telemachlearning/telemach copie le bon binaire dans ton dossier des plugins Docker, sans rien d'autre à installer.

Linux et WSL2 :

mkdir -p ~/.docker/cli-plugins
docker run --rm --user "$(id -u):$(id -g)" -v ~/.docker/cli-plugins:/sortie telemachlearning/telemach:0.2.0 install

macOS (Docker Desktop) :

mkdir -p ~/.docker/cli-plugins
docker run --rm --user "$(id -u):$(id -g)" -e HOST_OS=darwin -v ~/.docker/cli-plugins:/sortie telemachlearning/telemach:0.2.0 install

Ce que fait chaque option, et ce qu'elle t'apprend de Docker :

Option Rôle
mkdir -p ~/.docker/cli-plugins crée le dossier avant : sinon Docker le crée lui-même, avec le compte root, et tu ne pourrais plus le gérer sans sudo
-v ~/.docker/cli-plugins:/sortie montage (bind mount) : donne au conteneur accès à ce seul dossier de ta machine
--user "$(id -u):$(id -g)" le conteneur s'exécute avec ton identité : il peut écrire dans ton dossier et le fichier t'appartient
-e HOST_OS=darwin variable d'environnement : indique que ta machine est un Mac (binaire macOS au lieu de Linux)
--rm supprime le conteneur une fois l'installation terminée
:0.2.0 tag explicite : tu sais exactement quelle version tu installes

L'image existe aussi sous le tag latest, mais préfère un tag de version : latest change à chaque publication, et une même commande pourrait installer deux versions différentes. Pour mettre à jour, relance la commande avec la nouvelle version : l'image indique la version remplacée.

L'image est minimale (FROM scratch : ni shell, ni gestionnaire de paquets), s'exécute sans privilèges et est signée. Vérification avec cosign v3 :

cosign verify telemachlearning/telemach:0.2.0 \
  --certificate-identity-regexp '^https://github\.com/aboigues/telemach-plugin-docker/\.github/workflows/release\.yml@refs/tags/v' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com
Essayer sans rien installer

Pour voir ce que TELEMACH dit de ton fichier Compose sans rien installer, lance l'image depuis le dossier de ton projet :

docker run --rm -t -v "$PWD":/projet:ro telemachlearning/telemach:0.2.0 check /projet
  • -v "$PWD":/projet:ro monte le dossier courant dans le conteneur, en lecture seule (:ro) : l'image ne peut rien y modifier ;
  • -t alloue un terminal, pour avoir les couleurs.

Les variables d'environnement de ton shell ne sont pas visibles dans le conteneur : si ton fichier Compose utilise ${NOM_VARIABLE}, TELEMACH la signalera comme non définie. Transmets-la avec -e, par exemple docker run --rm -t -e NOM_VARIABLE -v "$PWD":/projet:ro telemachlearning/telemach:0.2.0 check /projet.

L'essai ne couvre que la vérification des fichiers Compose : l'explication automatique des erreurs de docker demande d'installer le plugin.

Compiler depuis les sources

Il faut Go 1.27 ou plus récent (la version exacte, 1.27.2, est téléchargée automatiquement par Go).

git clone https://github.com/aboigues/telemach-plugin-docker.git
cd telemach-plugin-docker
mkdir -p ~/.docker/cli-plugins
go build -o ~/.docker/cli-plugins/docker-telemach ./cmd/docker-telemach
Vérifier l'installation

Docker découvre automatiquement les plugins placés dans ~/.docker/cli-plugins/. Vérifie :

docker telemach --version        # version, licence et site du projet
docker telemach --help
docker --help | grep telemach    # « telemach*  Explique en français les erreurs… »
2. Activer l'explication automatique

Ajoute la ligne correspondant à ton shell à la fin de son fichier de configuration :

# zsh — dans ~/.zshrc
eval "$(docker telemach shell-init zsh)"

# bash — dans ~/.bashrc
eval "$(docker telemach shell-init bash)"

Puis ouvre un nouveau terminal (ou recharge la configuration avec source ~/.zshrc).

3. Tester
type docker              # « docker is a shell function » : l'intégration est active
docker run --rm ngnix    # faute de frappe volontaire : TELEMACH propose « nginx »
docker telemach deepen   # approfondit cette erreur
Mettre à jour

Refais l'étape 1 avec la nouvelle version (VERSION=…) : le binaire est remplacé. Depuis les sources : git pull puis la même commande go build.

Désinstaller
  1. Retire la ligne eval "$(docker telemach shell-init …)" de ton ~/.zshrc ou ~/.bashrc.

  2. Supprime le plugin et son état local :

    rm ~/.docker/cli-plugins/docker-telemach
    rm -rf ~/.local/state/telemach
    
Dépannage
Symptôme Cause probable et solution
docker: unknown command: docker telemach Le binaire n'est pas dans ~/.docker/cli-plugins/, n'est pas exécutable, ou ne correspond pas à ton système : relance l'étape 1.
Aucune explication après une erreur Vérifie avec type docker que la fonction est active, et que TELEMACH_DISABLE n'est pas à 1.
Pas de couleurs La sortie n'est pas un terminal, ou NO_COLOR est défini. Force avec --color=always.
go: downloading go1.27.2… lors de la compilation Normal : Go télécharge la bonne version de sa chaîne d'outils.

Commandes

Commande Rôle
docker telemach check [-f fichier]... [dossier] Vérifie un projet Compose avant de le lancer (code 0 : aucun problème, 1 : problème trouvé, 2 : fichier introuvable)
docker telemach last Réaffiche l'explication complète de la dernière erreur (après une erreur répétée, ou si tu as effacé ton terminal)
docker telemach deepen [--exercise] Approfondit le concept de la dernière erreur expliquée
docker telemach shell-init bash|zsh Affiche le code d'intégration à évaluer dans ton shell
docker telemach explain … Utilisée par l'intégration shell (tu n'as pas à l'appeler)

Confidentialité et sécurité

  • Fonctionne 100 % en local, sans aucun accès réseau.
  • N'exécute aucune commande et ne modifie aucun de tes fichiers : il propose, tu décides. Seule exception : docker --version, lu une fois à l'activation pour connaître ta version de Docker.
  • Masque les secrets (mots de passe, jetons, clés) partout où il affiche ou enregistre quelque chose.
  • Le dernier diagnostic, déjà masqué, est conservé dans ~/.local/state/telemach/ (droits 0600) pour la commande deepen.

Couleurs

La sortie est colorée dans un terminal ; chaque bloc garde aussi un symbole et un libellé (✖, 📘, 🔎, 💡, ⚠), pour rester lisible sans couleur.

  • --color=auto|always|never (par défaut auto) ;
  • NO_COLOR=1 désactive les couleurs, CLICOLOR_FORCE=1 les force ;
  • la palette s'adapte aux fonds clairs et sombres (variable COLORFGBG ou interrogation du terminal).

Désactivation ponctuelle

TELEMACH_DISABLE=1 docker …

Contribuer

Le projet suit une constitution : pédagogie, français pour l'humain et anglais pour le code, sécurité élevée, gates GitHub Actions obligatoires et mémoire des incidents (LESSON-LEARNED.md). Voir CONTRIBUTING.md et, pour enrichir le catalogue d'erreurs, docs/catalogue.md.

Signalement de vulnérabilité : voir SECURITY.md.

Licence

TELEMACH PLUGIN DOCKER est un logiciel libre distribué sous la licence Apache 2.0 — © 2026 TELEMACH Learning. Tu peux l'utiliser, le modifier et le redistribuer, y compris pour tes formations, en conservant les mentions des fichiers LICENSE et NOTICE.

Directories

Path Synopsis
cmd
docker-telemach command
Commande docker-telemach : plugin Docker CLI pédagogique qui explique en français les erreurs de Docker et de Docker Compose.
Commande docker-telemach : plugin Docker CLI pédagogique qui explique en français les erreurs de Docker et de Docker Compose.
telemach-image command
Commande telemach-image : point d'entrée de l'image telemachlearning/telemach.
Commande telemach-image : point d'entrée de l'image telemachlearning/telemach.
internal
catalog
Package catalog charge et valide le catalogue d'erreurs Docker embarqué, dont le contenu pédagogique est rédigé en français.
Package catalog charge et valide le catalogue d'erreurs Docker embarqué, dont le contenu pédagogique est rédigé en français.
command
Package command analyse les arguments d'une commande docker ou docker compose.
Package command analyse les arguments d'une commande docker ou docker compose.
compose
Package compose analyse les fichiers Docker Compose, en lecture seule, pour localiser précisément les erreurs (fichier, ligne, colonne, clé).
Package compose analyse les fichiers Docker Compose, en lecture seule, pour localiser précisément les erreurs (fichier, ligne, colonne, clé).
diagnose
Package diagnose associe une erreur capturée à une entrée du catalogue et détermine si elle provient de Docker ou de l'application du conteneur.
Package diagnose associe une erreur capturée à une entrée du catalogue et détermine si elle provient de Docker ou de l'application du conteneur.
plugin
Package plugin implémente le protocole des plugins de la CLI Docker (sous-commande docker-cli-plugin-metadata), sans dépendre de github.com/docker/cli.
Package plugin implémente le protocole des plugins de la CLI Docker (sous-commande docker-cli-plugin-metadata), sans dépendre de github.com/docker/cli.
redact
Package redact masque les valeurs sensibles (mots de passe, jetons, clés) avant tout affichage ou toute écriture sur disque.
Package redact masque les valeurs sensibles (mots de passe, jetons, clés) avant tout affichage ou toute écriture sur disque.
render
Package render produit la sortie colorée et accessible destinée à l'apprenant.
Package render produit la sortie colorée et accessible destinée à l'apprenant.
sanitize
Package sanitize neutralise les séquences d'échappement ANSI et les caractères de contrôle présents dans des textes non fiables.
Package sanitize neutralise les séquences d'échappement ANSI et les caractères de contrôle présents dans des textes non fiables.
shellinit
Package shellinit génère le code d'intégration bash et zsh qui capte les erreurs des commandes docker et les transmet à docker-telemach explain.
Package shellinit génère le code d'intégration bash et zsh qui capte les erreurs des commandes docker et les transmet à docker-telemach explain.
state
Package state conserve localement le dernier diagnostic, déjà masqué, pour l'approfondissement et la détection des répétitions.
Package state conserve localement le dernier diagnostic, déjà masqué, pour l'approfondissement et la détection des répétitions.
textdist
Package textdist calcule des distances d'édition pour suggérer le mot le plus proche (nom d'image, clé Compose).
Package textdist calcule des distances d'édition pour suggérer le mot le plus proche (nom d'image, clé Compose).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL