1 Symptôme
Au moment d'exécuter ./construire.sh ou docker build, la commande échoue dès l'étape FROM avec un message comme celui-ci :
Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on [::1]:53: read udp [::1]:50506->[::1]:53: read: connection refused
Le détail révélateur est [::1]:53 : Docker tente d'interroger un serveur DNS sur le loopback IPv6 local, où aucun service n'écoute.
2 Cause
Le démon Docker hérite des serveurs DNS du système. Si /etc/resolv.conf contient une référence à 127.0.0.53 (systemd-resolved) ou à une adresse loopback IPv6, Docker la copie tel quel à l'intérieur des conteneurs de build, où ce loopback ne pointe sur rien d'utile. La résolution échoue, le pull aussi.
L'hôte, lui, continue à résoudre les noms sans problème (le service écoute bien sur son propre loopback). C'est uniquement le contexte d'exécution du build Docker qui est aveugle.
3 Maintenance et opérations
La correction consiste à fournir au démon Docker une liste de serveurs DNS publics fiables, indépendants de la configuration locale.
/etc/docker/daemon.json avec une liste de résolveurs publics. Si le fichier existe déjà, fusionner la clé dns avec le contenu en place plutôt que d'écraser.daemon.json automatiquement, un redémarrage est nécessaire pour appliquer la nouvelle configuration DNS.--restart unless-stopped redémarrent seuls. Évitez de faire cette opération en pleine démonstration de classe : faites-la avant.
Status: Downloaded newer image ou Image is up to date.
4 Prévention pour les postes du laboratoire
Pour éviter que chaque étudiant rencontre l'erreur lors du tout premier build, deux options selon la maîtrise du parc de postes :
- Approvisionnement initial : déployer
/etc/docker/daemon.jsonen même temps que l'installation de Docker, via le script de préparation des postes. - Pré-téléchargement des images de base : faire un
docker pull httpd:alpineet autres images du cours sur l'image disque de référence. Cela protège aussi contre les coupures réseau ponctuelles pendant les démonstrations.
--dns 1.1.1.1. Attention, cette option ne s'applique qu'aux conteneurs déjà construits, pas à l'étape de pull du build.