J'essaie de construire une nouvelle image Docker pour notre processus de développement, en utilisant cpanm
pour installer un tas de modules Perl comme image de base pour divers projets.
Lors du développement du Dockerfile, cpanm
renvoie un code d'échec car certains modules ne se sont pas installés correctement.
Je suis assez sûr que je dois apt
installer d'autres choses.
Ma question est, où puis-je trouver le /.cpanm/work
répertoire cité dans la sortie, afin d'inspecter les journaux? Dans le cas général, comment puis-je inspecter le système de fichiers d'une docker build
commande ayant échoué ?
Montage du matin Après avoir mordu la balle et exécuté un find
je découvre
/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm
Est-ce fiable, ou est-ce que je ferais mieux de construire un conteneur "nu" et d'exécuter des choses manuellement jusqu'à ce que j'aie tout ce dont j'ai besoin?
/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm
ceux-ci sont des internes de Docker et je ne voudrais pasRéponses:
Chaque fois que docker exécute avec succès une
RUN
commande à partir d'un Dockerfile, une nouvelle couche dans le système de fichiers image est validée . Idéalement, vous pouvez utiliser ces identifiants de calques comme images pour démarrer un nouveau conteneur.Prenez le Dockerfile suivant:
et le construire:
Vous pouvez maintenant lancer un nouveau conteneur à partir
00f017a8c2a6
,044e1532c690
et5bd8172529c1
:bien sûr, vous voudrez peut-être démarrer un shell pour explorer le système de fichiers et essayer les commandes:
Lorsque l'une des commandes Dockerfile échoue, ce que vous devez faire est de rechercher l' id de la couche précédente et d'exécuter un shell dans un conteneur créé à partir de cet id:
Une fois dans le conteneur:
Si vous avez vraiment besoin d'expérimenter le calque réel qui a échoué au lieu de travailler à partir du dernier calque de travail, voir la réponse de Drew .
la source
docker run --rm -it <id_last_working_layer> bash -il
et une fois dans le conteneur, essayez la commande qui n'a pas pu reproduire le problème, puis corrigez la commande et testez-la, enfin mettez à jour votre Dockerfile avec la commande fixed.docker diff <container>
obtenir une liste complète des modifications spécifiques du système de fichiers effectuées sur cette couche particulière (fichiers ajoutés, supprimés ou modifiés sur l'ensemble du système de fichiers pour cette image).Unable to find image 'd5219f1ffda9:latest' locally
. Cependant, j'étais confus par les multiples types d'identifiants. Il s'avère que vous devez utiliser les identifiants qui se trouvent directement après les flèches, pas ceux qui disent "Running in ...".La première réponse fonctionne dans le cas où vous souhaitez examiner l'état immédiatement avant l'échec de la commande.
Cependant, la question demande comment examiner l'état du conteneur défaillant lui-même. Dans ma situation, la commande ayant échoué est une génération qui prend plusieurs heures, donc le rembobinage avant la commande qui a échoué et la relancer prend beaucoup de temps et n'est pas très utile.
La solution ici est de trouver le conteneur qui a échoué:
Validez-le sur une image:
Et puis exécutez l'image [si nécessaire, exécutez bash]:
Vous regardez maintenant l'état de la génération au moment où elle a échoué, plutôt qu'au moment avant d'exécuter la commande à l'origine de l'échec.
la source
DOCKER_BUILDKIT=1
pour construire votreDockerfile
Docker met en cache l'intégralité de l'état du système de fichiers après chaque
RUN
ligne réussie .Sachant que:
RUN
commande en échec , commentez-le dans le Dockerfile (ainsi que toutes lesRUN
commandes suivantes ), puis exécutezdocker build
etdocker run
recommencez.RUN
commande défaillante , ajoutez-y simplement|| true
pour le forcer à réussir; puis procédez comme ci-dessus (laissez toutes lesRUN
commandes suivantes commentées, exécutezdocker build
etdocker run
)Tada, pas besoin de jouer avec les internes de Docker ou les identifiants de couche, et en bonus Docker minimise automatiquement la quantité de travail à refaire.
la source
Le débogage des échecs des étapes de génération est en effet très ennuyeux.
La meilleure solution que j'ai trouvée est de s'assurer que chaque étape qui fait un vrai travail réussit, et en ajoutant une vérification après celles qui échouent. De cette façon, vous obtenez une couche validée qui contient les sorties de l'étape ayant échoué que vous pouvez inspecter.
Un Dockerfile, avec un exemple après la
# Run DB2 silent installer
ligne:la source
Ce que je ferais, c'est commenter le Dockerfile ci-dessous et y compris la ligne incriminée. Ensuite, vous pouvez exécuter le conteneur et exécuter les commandes du docker à la main, et consulter les journaux de la manière habituelle. Par exemple, si le Dockerfile est
et il se meurt au bar je ferais
ensuite
la source