Je voudrais démarrer un conteneur Docker arrêté avec une commande différente, car la commande par défaut se bloque - ce qui signifie que je ne peux pas démarrer le conteneur, puis utiliser 'docker exec'.
Fondamentalement, je voudrais démarrer un shell afin de pouvoir inspecter le contenu du conteneur.
Heureusement, j'ai créé le conteneur avec l'option -it!
inspect
sortie en une configuration utilisée lors de l'exécution suivante?Modifiez ce fichier (correspondant à votre conteneur arrêté):
Modifiez le paramètre "Path" pour pointer vers votre nouvelle commande, par exemple / bin / bash. Vous pouvez également définir le paramètre "Args" pour passer des arguments à la commande.
Redémarrez le service docker (notez que cela arrêtera tous les conteneurs en cours d'exécution):
Listez vos conteneurs et assurez-vous que la commande a changé:
Démarrez le conteneur et attachez-le, vous devriez maintenant être dans votre coquille!
A travaillé sur Fedora 22 à l'aide de Docker 1.7.1.
REMARQUE: si votre shell n'est pas interactif (par exemple, vous n'avez pas créé le conteneur d'origine avec l'option -it), vous pouvez remplacer la commande par "/ bin / sleep 600" ou "/ bin / tail -f / dev / null" pour vous donner suffisamment de temps pour faire "docker exec -it CONTID / bin / bash" comme une autre façon d'obtenir un shell.
REMARQUE 2: les nouvelles versions de docker ont config.v2.json, où vous devrez modifier Entrypoint ou Cmd (merci user60561).
la source
..."Path":"tail","Args":["-f","/dev/null"]...
config.v2.json
, où vous devrez changer soitEntrypoint
ouCmd
.Ajoutez un chèque en haut de votre script Entrypoint
Docker a vraiment besoin de l'implémenter en tant que nouvelle fonctionnalité, mais voici une autre option de contournement pour les situations dans lesquelles vous avez un Entrypoint qui se termine après un succès ou un échec, ce qui peut rendre le débogage difficile.
Si vous n'avez pas encore de script Entrypoint, créez-en un qui exécute les commandes dont vous avez besoin pour votre conteneur. Ensuite, en haut de ce fichier, ajoutez ces lignes à
entrypoint.sh
:Pour garantir le
cat
maintien de la connexion, vous devrez peut-être fournir un ATS. J'exécute le conteneur avec mon script Entrypoint comme ceci:Cela entraînera l'exécution du script une fois, créant un fichier qui indique qu'il a déjà été exécuté (dans le système de fichiers virtuel du conteneur). Vous pouvez ensuite redémarrer le conteneur pour effectuer le débogage:
Lorsque vous redémarrez le conteneur, le
already_ran
fichier est trouvé, ce qui provoque le blocage du script Entrypointcat
(qui attend juste indéfiniment une entrée qui ne viendra jamais, mais maintient le conteneur en vie). Vous pouvez ensuite exécuter unebash
session de débogage :Pendant l'exécution du conteneur, vous pouvez également supprimer
already_ran
et exécuter manuellement leentrypoint.sh
script pour le réexécuter, si vous avez besoin de déboguer de cette façon.la source
/bin/sh
au lieu decat
- alors vous pouvez toujours entrer simplement en redémarrant. Votre solution est géniale!Mon problème:
docker run <IMAGE_NAME>
docker ps -a
je pouvais voir deux conteneurs.docker run <IMAGE_NAME>
commande, une nouvelle image est crééeSolution: pour travailler sur le même conteneur que vous avez créé lors de la première exécution, procédez comme suit
docker ps
pour obtenir le conteneur de votre conteneurdocker container start <CONTAINER_ID>
pour démarrer le conteneur existantdocker exec -it <CONTAINER_ID> /bin/bash
la source
docker run <containerID>
J'ai pris la réponse de @ Dmitriusan et en ai fait un alias:
Ajoutez ceci dans votre
~/.bashrc
fichier d'alias et vous aurez un nouveldocker-run-prev-container
alias astucieux qui vous déposera dans un shell dans le conteneur précédent.Utile pour le débogage a échoué
docker build
s.la source
Ce n'est pas exactement ce que vous demandez, mais vous pouvez l'utiliser
docker export
sur un conteneur arrêté si tout ce que vous voulez est d'inspecter les fichiers.la source
Il n'a pas été spécifié si le conteneur se termine, mais seulement que votre code se bloque et que vous devez voir ce qui se passe dans le conteneur. S'il ne se termine pas, voici une autre solution potentielle.
Obtenez l'ID du conteneur avec
docker ps
docker exec -it 665b4a1e17b6 /bin/sh
Si le point d'entrée est défini sur quelque chose de problématique, il peut également être ignoré comme suggéré dans la réponse de Dmitriusan. Il convient également de noter que vous pouvez attacher à n'importe quel conteneur en cours d'exécution avec
docker attach
. Tant de solutions différentes solutions. Je ne vois tout simplement pas la nécessité de s'engager sur l'image. Cela semble inutile.Docs pour Docker exec - https://docs.docker.com/engine/reference/commandline/exec/
Documents pour Docker attach - https://docs.docker.com/engine/reference/commandline/attach/
la source
Je suis en fait en désaccord avec ces deux réponses. Si vous voulez simplement voir ce qu'il y a dans le conteneur, vous pouvez exécuter cette commande pour obtenir un shell. Pas besoin de changer le point d'entrée du tout ou des configurations.
la source
docker logs <container_id> --follow
vous fournirez ce dont vous avez besoin. Une autre alternative consiste à utiliser la commande ci-dessus, puis à démarrer le service de blocage sur cette image avec la même commande dans le dockerfile et à déboguer à partir de là.la source