Docker/Problèmes connus
Accéder aux logs
modifierPar exemple si un conteneur ne se lance pas ou se relance toutes les secondes, un motif plus précis qu'en console peut se trouver dans les logs.
Pour le démon :
tail /var/log/docker.log
Pour les conteneurs
modifierdocker compose logs
Ces deux commandes acceptent l'argument "-f" pour les afficher en temps réel.
Pour un seul conteneur
modifierdocker compose logs nom_du_conteneur
ou :
docker logs nom_du_conteneur
Définir les droits des fichiers partagés avec le conteneur
modifierSi le conteneur est amené à modifier les fichiers du volume, par défaut il a les droits root de la machine hôte.
Pour éviter cela, on peut faire un chown www-data
dans Dockerfile, ou utiliser UID 1000
(si le compte utilisé par la machine hôte est local).
Récupérer l'IP d'un conteneur
modifierdocker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nom_du_conteneur # ou docker inspect --format='{{.NetworkSettings.Networks.apps.IPAddress}}' nom_du_conteneur # où "apps" est le nom du réseau
Récupérer la version de l'image d'un conteneur
modifierdocker image inspect --format 'Modèle:Json .' "nom_du_conteneur"
Réinitialiser les conteneurs à zéro
modifier
Cette opération peut prendre du temps car Docker télécharge à nouveau tous les paquets ensuite.
Linux :
docker rm -f $(docker ps -a -q); docker rmi -f $(docker images -q); docker network rm $(docker network ls -q)
Windows :
docker rm -f $(docker ps -a -q); docker rmi -f $(docker images -q); docker network rm $(docker network ls -q)
La partie network peut être exécutée indépendamment, par exemple en cas de message ERROR: Pool overlaps with other one on this address space.
Messages d'erreur
modifierSous Windows
modifier/usr/bin/env: 'php\r': No such file or directory
modifierUtiliser "winpty". Ex :
docker exec -it php7.3-fpm bash
Sinon[1] :
docker exec -it <container> bash cd bin tr -d '\015' <console >console.new mv console console.old mv console.new console
Certains conteneurs ne peuvent pas être lancés (timeout)
modifierVérifier que le partage Windows a bien été fait : clic droit, Settings, Resources, File Sharing, C: (puis relancer Docker Desktop).
Le partage de volume ne fonctionne pas sur Linux
modifierSi ça n'a jamais fonctionné : ajouter son compte au groupe "docker" et redémarrer la machine hôte.
Le partage de volume ne fonctionne pas sur Windows
modifierSi ça n'a jamais fonctionné : ajouter son compte dans le groupe "docker-users", et redémarrer la machine hôte.
C'est peut-être lié à la plage d'IP de Docker, remettre celle par défaut.
Si ça marchait sur Windows 10 pro dans un Active Directory et que ça ne fonctionne plus en dehors de l'AD ou en VPN, c'est un bug avec Docker Desktop 2.1.0.5 qui semble résolu dans la 2.1.6.1. En effet, seul un admin de l'AD peut autoriser le partage des volumes, et le port 445 doit être ouvert.
Pour tester si ça marche :
docker run -v c:/Users:/data alpine ls data
500: {"Message":"Unhandled exception: Drive has not been shared"}'
modifierDans Docker Desktop, partager le volume concerné.
502 Bad Gateway dans Nginx et Bus error dans les commandes PHP
modifierRedémarrer Docker Desktop.
Sinon c'est un processus PHP qui gonfle à outrance à cause du code.
ERROR: failed to create new listening socket: socket(): Address family not supported by protocol (97)
modifierRelancer Docker Desktop.
Error: mounting wslCLIDest: stat /mnt/host/c/Program Files/Docker/Docker/resources/wsl/docker-wsl-cli.iso: no such file or directory
modifierDécocher Use the WSL 2 based engine dans les options et relancer Docker Desktop[2].
fatal: not a git repository (or any parent up to mount point /var) Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)
modifierRedémarrer Docker Desktop.
Error response from daemon: Mount denied: The source path "mon_dossier;C" doesn't exist and is not known to Docker
modifierSous Git Bash dans Windows, il faut préfixer le chemin local par "/". Ex : docker run -it --rm -v /${PWD}:/wkDir $IMAGE_TAG yarn dev
[3]
Invalid mode /var/www
modifierLe chemin d'accès dans docker-compose.yml n'est pas compris. Cela se produit pas exemple quand on met des antislashs à la place des slashs.
Sous Linux
modifierstandard_init_linux.go:211: exec user process caused "no such file or directory"
modifierCela peut se produire quand des conteneurs testés sur Linux sont utilisés sur Windows.
Il faut changer les retours chariots du fichier appelé par "ENTRYPOINT" dans le Dockerfile, de CRLF (Windows) vers LF (Unix). Ex : dos2unix php7.4-fpm/bin/custom-docker-php-entrypoint
Puis reconstruire et relancer le conteneur.
Autres solutions
modifierOn peut aussi lancer "dos2unix" automatiquement depuis le dockerfile sur une copie de l'exéutable[4].
S'il s'agit d'un dépôt Git, on peut aussi le sauvegarder autrement depuis Linux[5] :
- lancer
git config core.autocrlf false
- créer un fichier .gitattributes[6] contenant
text eol=lf
container_linux.go:349: starting container process caused "exec: \"custom-docker-php-entrypoint\": executable file not found in $PATH": unknown
modifierCela peut se produire quand des conteneurs testés sur Windows sont utilisés sur Linux.
Il faut changer leur donner les droits d'exécution (chmod +x
).
Puis reconstruire et relancer le conteneur.
Pour tout OS
modifier/bin/sh: no such file or directory
modifierForcer la reconstruction :
DOCKER_BUILDKIT=0 docker compose build
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
modifiersudo usermod -aG docker $USER
Si ça ne marche pas, relancer docker en administrateur.
Cannot start service xxx: Address already in use
modifierDeux processus utilisent le même port.
- Si c'est deux conteneurs, dans Docker Compose, si l'un des deux avait été retiré, il était peut-être configuré en
restart: always
et il faut le remettre dans docker-compose.yml pour le stopper. - Si l'un vient de la machine hôte, l'identifier avec
sudo netstat -tulpn | grep ':80 '
puis le stopper.
Cannot start service xxx :driver failed programming external connectivity on endpoint
modifierImpossible de lancer un conteneur sur Windows :
- Soit Docker n'a pas accès au volume, et il faut cocher la case "Shared drives" dans Docker Desktop, ou lancer la commande suivante en acceptant le partage :
docker run --rm -v c:/Users:/data alpine ls /data
- Soit Docker n'a pas accès aux ports de ses conteneurs, et il faut fermer les processus qui les utilisent. Il peut même s'agir d'une deuxième instance de Docker.
Couldn't connect to Docker daemon at http+docker://localhost - is it running?
modifier/etc/init.d/docker start
Si le démon ne se lance pas, upgrader l'OS et redémarrer. Sinon, réinstaller Docker.
Could not resolve host: xxx (pas de DNS)
modifierRevoir la plage d'IP définie dans le paragraphe "networks" de docker-compose.yml.
Device or resource busy, Cette action ne peut pas être réalisée car le fichier est ouvert dans com.docker.backend.exe
modifierC'est un bug connu (sur Linux et Windows) quand composer installe certains paquets[7]. On ne peut supprimer le fichier qu'en fermant tout Docker (sous Windows en tout cas, il ne suffit pas de le redémarrer).
Cela se produit (en cas de réécriture d'historique ?), repartir d'une branche propre avant de relancer "composer install". Sinon, le lancer dans une VM et récupérer le dossier vendor.
Error response from daemon: Get https://xxx: no basic auth credentials
modifierSur certains dépôts privés, pour faire un docker pull
il faut préalablement se loguer. Ex :
docker login -u mon_utilisateur -p mon_mdp mon_url
Invalid interpolation format for "environment" option in service "documents": "^https?://.*?$"
modifierÉchapper le $ interprété dans docker-compose.yml. Par exemple, remplacer :
CORS_ALLOW_ORIGIN: "^https?://.*?$"
par :
CORS_ALLOW_ORIGIN: "^https?://.*?$$"
"encore dev-server --host my_url" ne marche pas
modifierMapper l'URL définie dans cette commande de package.json, avec 0.0.0.0 dans docker-compose.yml :
extra_hosts: - "my_url:0.0.0.0"
Références
modifier- ↑ https://www.thetopsites.net/article/50789087.shtml
- ↑ https://github.com/docker/for-win/issues/6822
- ↑ https://stackoverflow.com/questions/50608301/docker-mounted-volume-adds-c-to-end-of-windows-path-when-translating-from-linux
- ↑ https://willi.am/blog/2016/08/11/docker-for-windows-dealing-with-windows-line-endings/
- ↑ https://stackoverflow.com/questions/53165471/building-docker-images-on-windows-entrypoint-script-no-such-file-or-directory
- ↑ https://git-scm.com/docs/gitattributes
- ↑ https://github.com/moby/moby/issues/22260