J'ai créé un conteneur avec -d
donc ce n'est pas interactif.
docker run -d shykes/pybuilder bin/bash
Je vois que le conteneur est sorti:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d6c45e8cc5f0 shykes/pybuilder:latest "bin/bash" 41 minutes ago Exited (0) 2 seconds ago clever_bardeen
Maintenant, je voudrais exécuter des commandes occasionnelles sur la machine et quitter. Juste pour obtenir la réponse.
J'ai essayé de démarrer la machine. J'ai essayé d'attacher. Je pensais pouvoir appeler run
avec un conteneur, mais cela ne semble pas être autorisé. L'utilisation start
semble juste fonctionner et puis exister rapidement.
Je voudrais revenir en mode interactif après avoir quitté.
J'ai essayé:
docker attach d6c45e8cc5f0
Mais je reçois:
2014/10/01 22:33:34 You cannot attach to a stopped container, start it first
Mais si je le démarre, il sort quand même. Catch 22. Je ne peux pas gagner.
docker container ls -a
Réponses:
En octobre 2014, l' équipe Docker a introduit la
docker exec
commande : https://docs.docker.com/engine/reference/commandline/exec/Alors maintenant, vous pouvez exécuter n'importe quelle commande dans un conteneur en cours d'exécution en connaissant simplement son ID (ou son nom):
Notez que la
exec
commande ne fonctionne que sur un conteneur déjà en cours d'exécution. Si le conteneur est actuellement arrêté, vous devez d'abord l'exécuter avec la commande suivante:La chose la plus importante ici est l'
-d
option, qui représentedetached
. Cela signifie que la commande que vous avez initialement fournie au conteneur (/bin/bash
) sera exécutée en arrière-plan et que le conteneur ne s'arrêtera pas immédiatement .la source
CDR LDN
àcdrev
la réponse ci - dessous ( stackoverflow.com/a/26181666/149428 ).-it
?Votre conteneur sortie que la commande vous lui avez donné prendra fin. Utilisez les options suivantes pour le maintenir en ligne:
-i
Gardez STDIN ouvert même s'il n'est pas attaché.-t
Attribuez un pseudo-ATS.Votre nouvelle
run
commande est donc:Si vous souhaitez attacher à un conteneur déjà en cours d'exécution:
Dans ces exemples,
/bin/bash
la commande est utilisée.la source
docker exec -it CONTAINER_ID /bin/bash -c "export VAR=1 && echo $VAR"
Variable vide testée et imprimée (attendue1
). Qu'est-ce que je rate?-it
n'est pas disponible.Je pense donc que la réponse est plus simple que de nombreuses réponses trompeuses ci-dessus.
Pour démarrer un conteneur existant qui est arrêté
Pour arrêter un conteneur en cours d'exécution
Ensuite, pour vous connecter au shell interactif d'un conteneur
Pour démarrer un conteneur existant et s'y attacher en une seule commande
Attention, cela arrêtera le conteneur en sortie. Mais en général, vous devez démarrer le conteneur, l'attacher et l'arrêter une fois que vous avez terminé.
la source
Pour développer la réponse de katrmr, si le conteneur est arrêté et ne peut pas être démarré en raison d'une erreur, vous en aurez besoin
commit
dans une image. Ensuite, vous pouvez lancer bash dans la nouvelle image:la source
dshell
pour le faire automatiquement dans une variété de situations - github.com/avirshup/docker-cli-sugarCertaines des réponses ici sont trompeuses car elles concernent des conteneurs en cours d'exécution et non arrêtés.
Sven Dowideit a expliqué sur le forum Docker que les conteneurs sont liés à leur processus (et Docker ne peut pas changer le processus d'un conteneur arrêté, apparemment en raison au moins de sa structure interne: https://github.com/docker/docker/issues / 1437 ). Donc, fondamentalement, la seule option est de
commit
créer un conteneur vers une image etrun
avec une commande différente.Voir https://forums.docker.com/t/run-command-in-stopped-container/343
(je pense que l'
ENTRYPOINT
approche " avec arguments" ne fonctionnerait pas non plus, car vous ne pourriez toujours pas modifier la arguments à un conteneur arrêté.)la source
bin/bash
sans-it
ne changerait rien dans le conteneur, donc le commettre n'est pas vraiment nécessaire et CDR LDN donne la bonne réponse à la situation particulière de l'OP. Pourtant,commit
c'est la réponse au problème technique de la façon de changer le processus de conteneur.J'ai dû utiliser bash -c pour exécuter ma commande:
docker exec -it CONTAINER_ID bash -c "mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql"
la source
Créer un conteneur et lui envoyer des commandes une par une:
la source
Il s'agit d'une réponse combinée que j'ai inventée en utilisant la réponse CDR LDN ci-dessus et la réponse que j'ai trouvée ici .
L'exemple suivant démarre un conteneur Arch Linux à partir d'une image, puis installe
git
sur ce conteneur à l'aide de l'pacman
outil:C'est tout.
la source
Si vous essayez d'exécuter un script shell, vous devez l'exécuter en tant que bash.
la source
Envoyer une commande à stdin
Doit supprimer le
-t
pour que cela fonctionne:Cela peut être plus pratique que l'utilisation des options CLI parfois.
Testé avec:
puis sur un autre shell:
Puis sur le premier shell:
Testé sur Docker 1.13.1, hôte Ubuntu 16.04.
la source
En supposant que l'image utilise le point d'entrée par défaut
/bin/sh -c
, l'exécution se/bin/bash
terminera immédiatement en mode démon (-d
). Si vous souhaitez que ce conteneur exécute un shell interactif, utilisez-it
plutôt que-d
. Si vous souhaitez exécuter des commandes arbitraires dans un conteneur exécutant généralement un autre processus, vous pouvez essayernsenter
ounsinit
. Jetez un œil à https://blog.codecentric.de/en/2014/07/enter-docker-container/ pour les détails.la source
Malheureusement, il est impossible de passer outre
ENTRYPOINT
aux arguments avecdocker run --entrypoint
pour atteindre cet objectif.la source
Je voudrais noter que la première réponse est un peu trompeuse.
Le problème avec l'exécution
docker run
est qu'un nouveau conteneur est créé à chaque fois. Cependant, il y a des cas où nous aimerions revoir de vieux conteneurs ou ne pas prendre de place avec de nouveaux conteneurs.(Étant donné
clever_bardeen
le nom du conteneur créé ...)Dans le cas d'OP, assurez-vous que l'image docker est d'abord exécutée en exécutant la commande suivante:
Ensuite, exécutez le conteneur Docker à l'aide de la commande suivante:
la source
Pour Mac:
si vous souhaitez vous connecter en tant qu'utilisateur root:
la source
Réponse simple: démarrez et attachez en même temps. Dans ce cas, vous faites exactement ce que vous avez demandé.
assurez-vous de changer
<CONTAINER_ID/CONTAINER_NAME>
la source
Ex:
la source
J'exécute le conteneur Windows et je dois regarder à l'intérieur du conteneur Docker pour les fichiers et le dossier créés et copiés.
Pour ce faire, j'ai utilisé la commande docker entrypoint suivante pour obtenir l'invite de commande en cours d'exécution à l'intérieur du conteneur ou l'attacher au conteneur.
Cela m'a aidé à la fois à l'invite de commande à attacher au conteneur et à garder le conteneur en direct. :)
la source
Un moyen rapide de reprendre et d'accéder au dernier conteneur quitté:
la source
J'utilise habituellement ceci:
pour interagir en permanence avec un conteneur en cours d'exécution.
la source