Parfois, vous devez enquêter sur un conteneur qui est arrêté ou un conteneur qui, après le démarrage, meurt très rapidement et s'arrête.
docker exec -ti <id> bash
ne fonctionne que sur les conteneurs en cours d'exécution, une fois terminée, l'invite bash se termine également.
Avec docker start
vous ne pouvez pas fournir une commande différente, et si le conteneur meurt à nouveau brutalement, vous n'aurez pas assez de temps pour entrer dans le conteneur et faire vos investigations.
Nous pouvons le faire docker commit
, puis docker run
sur la nouvelle image avec une commande différente, mais je me demande s'il existe d'autres alternatives.
Remarque : docker logs
renvoie simplement les applications imprimées sur stdout / stderr. Cela ne suffira peut-être pas pour déterminer le problème.
la source
Réponses:
Les moyens généraux de suivre pourquoi un processus sous Linux a échoué sont bons. L'une de ces méthodes consiste à exécuter un processus à l'aide de
strace
ce qui vous indiquera le processus d'appels système et indique généralement la raison de l'échec.Vous pouvez créer un
Dockerfile
qui ressemble à ceci:Exécutez ensuite votre nouvelle image à l'aide de
docker run debug_version strace original_cmd
.Pour les processus qui bifurquent des enfants (puis meurent), vous souhaitez exécuter
strace
l'-ff
option. Vous pouvez également mapper certains fichiers à l'aide des volumes de données Docker et utiliser l'-o
option destrace
pour y écrire. Mais en généralstrace
, la sortie sera stdout, ce qui est lisible en utilisantdocker log
.Connexes Q: processus Linux se termine mystérieusement
la source
docker commit
commencer par mon conteneur arrêté pour avoir une image à partir destrace
Alpine Linux, pkgs.alpinelinux.org/package/edge/main/x86_64/strace . Utilisez le gestionnaire de paquets Alpine pour l' installer,apk install strace
.Pour autant que je sache,
commit
etrun
sont les meilleures options ici pour vous donner un accès complet au conteneur tel qu'il était quand il est mort.Idéalement, votre conteneur cracherait des informations plus utiles en cas d'échec, mais c'est un tout autre sujet.
Modifier: pour développer ma réponse, si le conteneur est en train de mourir dès le début, vous pouvez également utiliser
docker run
pour spécifier une alternative--entrypoint
etCMD
. En général, je vais définir cela sur une boucle ou quelque chose qui ne sortira pas de lui-même. Une fois dans le conteneur, vous pouvez exécuter manuellement les étapes qui échouent, puis inspecter le résultat sans avoir à vous soucier de la sortie du conteneur.la source