Selon le tutoriel que j'ai lu jusqu'à présent, l'utilisation de " docker run -d
" démarrera un conteneur à partir de l'image et le conteneur s'exécutera en arrière-plan. Voici à quoi cela ressemble, nous pouvons voir que nous avons déjà un identifiant de conteneur.
root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d
Mais si j'ai couru " docker ps
", rien n'a été retourné.
J'ai donc essayé " docker ps -a
", je peux voir le conteneur déjà sorti:
root@docker:/home/root# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
605e3928cddd centos:latest "/bin/bash" 31 minutes ago Exited (0) 31 minutes ago kickass_swartz
Quelque chose que j'ai fait de mal? Comment puis-je résoudre ce problème?
docker run -it -d <image> /bin/bash
ceci démarre un shell bash de manière interactive et ne ferme pas le conteneur car le processus shell est actif.Réponses:
Le fichier docker centos a une commande par défaut
bash
.Cela signifie que lorsqu'il est exécuté en arrière-plan (
-d
), le shell se ferme immédiatement.Mise à jour 2017
Les versions plus récentes de docker autorisent l'exécution d'un conteneur à la fois en mode détaché et en mode de premier plan (
-t
,-i
ou-it
)Dans ce cas, vous n'avez besoin d'aucune commande supplémentaire et cela suffit:
Le bash attendra en arrière-plan.
Cela a été rapporté dans un premier temps Kalyani-Chaudhari « s réponse et détaillée en haricot jersey » s de réponse .
Notez que pour l' alpin , Marinos An rapporte dans les commentaires :
Réponse originale (2015)
Comme mentionné dans cet article :
Cela fonctionnerait donc:
Un
docker ps
montrerait le conteneur Centos toujours en cours d'exécution.De là, vous pouvez vous y attacher ou vous en détacher (ou
docker exec
certaines commandes).la source
docker exec -it <yourContainer> bash
.Selon cette réponse , l'ajout de l'
-t
indicateur empêchera la sortie du conteneur lors de l'exécution en arrière-plan. Vous pouvez ensuite utiliserdocker exec -i -t <image> /bin/bash
pour entrer dans une invite de shell.Il semble que l'option -t ne soit pas très bien documentée , bien que l'aide indique qu'elle "alloue un pseudo-ATS".
la source
tail -f /dev/null
docker run -t -d --name mysql -p 3306:3306 mysql
- ne fonctionne pas pour moi (ubuntu 14.04.5): STATUS = Quitté (1) il y a 4 secondesContexte
Un conteneur Docker exécute un processus (la "commande" ou "point d'entrée") qui le maintient en vie. Le conteneur continuera à s'exécuter tant que la commande continuera à s'exécuter.
Dans votre cas, la commande (
/bin/bash
, par défaut, oncentos:latest
) se ferme immédiatement (comme le fait bash lorsqu'il n'est pas connecté à un terminal et n'a rien à exécuter).Normalement, lorsque vous exécutez un conteneur en mode démon (avec
-d
), le conteneur exécute une sorte de processus démon (commehttpd
). Dans ce cas, tant que le démon httpd est en cours d'exécution, le conteneur restera actif.Ce que vous semblez essayer de faire, c'est de maintenir le conteneur en vie sans qu'un processus démon ne s'exécute à l'intérieur du conteneur. C'est quelque peu étrange (car le conteneur ne fait rien d'utile tant que vous n'interagissez pas avec lui, peut-être avec
docker exec
), mais il y a certains cas où il peut être judicieux de faire quelque chose comme ça.(Vouliez-vous dire d'accéder à une invite bash à l'intérieur du conteneur? C'est facile!
docker run -it centos:latest
)Solution
Un moyen simple de conserver indéfiniment un conteneur en mode démon consiste à exécuter
sleep infinity
la commande du conteneur. Cela ne repose pas sur des choses étranges comme l'allocation d'un ATS en mode démon. Bien qu'il repose sur des choses étranges comme l'utilisationsleep
comme commande principale.Solution alternative
Comme indiqué par cjsimon, l'
-t
option alloue un "pseudo-tty". Cette astuce consiste à continuer à fonctionner indéfiniment car il pense qu'il est connecté à un TTY interactif (même si vous n'avez aucun moyen d'interagir avec ce TTY particulier si vous ne passez pas-i
). Quoi qu'il en soit, cela devrait aussi faire l'affaire:Pas sûr à 100% si
-t
cela produira d'autres interactions étranges; laissez peut-être un commentaire ci-dessous si c'est le cas.la source
infinity
.Salut ce problème est dû au fait que les conteneurs Docker se terminent s'il n'y a aucune application en cours d'exécution dans le conteneur.
L'option consiste simplement à exécuter un conteneur en mode démon.
Donc, l'astuce pour faire fonctionner votre conteneur en continu est de pointer vers un fichier shell dans docker qui gardera votre application en cours d'exécution. Vous pouvez essayer avec un fichier start.sh
Ce start.sh devrait pointer vers une application sans fin.
Dans le cas où vous ne voulez pas qu'une application soit en cours d'exécution, vous pouvez installer
monit
ce qui gardera votre conteneur Docker en cours d'exécution. Veuillez nous faire savoir si ces deux cas ont fonctionné pour que vous continuiez à faire fonctionner votre conteneur.Bonne chance
la source
Vous pouvez accomplir ce que vous voulez avec:
ou
ou
Le paramètre de commande tel que suggéré par d'autres réponses (c'est-à-dire tail -f / dev / null) est complètement facultatif et n'est PAS requis pour que votre conteneur continue de fonctionner en arrière-plan.
Notez également que la documentation Docker suggère que la combinaison des options -i et -t entraînera son comportement comme un shell.
Voir:
https://docs.docker.com/engine/reference/run/#foreground
la source
J'ai cet extrait de code exécuté à partir du
ENTRYPOINT
dans mon fichier docker:Exécutez l'image de docker intégrée en tant que:
Connectez-vous au shell du conteneur:
la source
exécuter la commande comme suit:
si vous souhaitez spécifier le port, commandez comme ci-dessous:
vérifiez le conteneur en cours d'exécution à l'aide de la commande suivante:
la source
-t -d
vs-i -d
? Les deux garderont le conteneur en marche.Docker nécessite votre commande pour continuer à fonctionner au premier plan. Sinon, il pense que vos applications s'arrêtent et arrêtent le conteneur.
Donc, si votre script d'entrée de docker est un processus d'arrière-plan comme suit:
Le «&» fait s'arrêter et quitter le conteneur si aucun autre processus de premier plan n'est déclenché plus tard. Donc, la solution consiste simplement à supprimer le «&» ou à avoir un autre CMD de premier plan qui s'exécute après , tel
la source
touch
ce fichier en premier, au cas où vous ne pourriez pas trouver un fichier journal.Le conteneur Docker se ferme si la tâche à l'intérieur est terminée, donc si vous voulez la garder en vie même si elle n'a pas de travail ou est déjà terminée, vous pouvez le faire
docker run -di image
. Après cela,docker container ls
vous le verrez fonctionner.la source
Peut-être que ce n'est que moi, mais sur CentOS 7.3.1611 et Docker 1.12.6, mais j'ai finalement dû utiliser une combinaison des réponses publiées par @VonC et @Christopher Simon pour que cela fonctionne de manière fiable. Rien de ce que j'ai fait avant cela n'empêcherait le conteneur de se quitter après avoir exécuté CMD avec succès. Je démarre oracle-xe-11Gr2 et sshd.
Dockerfile
Ensuite, ajoutez -d -t et -i pour exécuter
Enfin après des heures à me frapper la tête contre le mur
Pour une raison quelconque, ce qui précède se terminera après l'exécution de CMD si la queue -f est supprimée, ou si l'une des options -t -d -i est omise.
la source
Je l'ai expliqué dans le post suivant qui a la même question.
Comment conserver le conteneur alpin Docker après avoir utilisé la «sortie»?
la source
J'ai eu le même problème, juste ouvrir un autre terminal avec un bash dessus a fonctionné pour moi:
créer un conteneur:
conteneur de démarrage:
lancez bash pour maintenir le conteneur en marche:
processus de démarrage dont vous avez besoin:
la source
Si vous utilisez CMD à la fin de votre Dockerfile, vous pouvez ajouter le code à la fin. Cela ne fonctionnera que si votre docker est construit sur Ubuntu ou sur tout système d'exploitation pouvant utiliser Bash.
En bref, la fin de votre Dockerfile ressemblera à quelque chose comme ça.
Donc, si vous avez quelque chose qui s'exécute automatiquement après avoir exécuté votre image de docker, et lorsque la tâche est terminée, le terminal bash sera actif dans votre docker. Ainsi, vous pouvez entrer vos commandes shell.
la source
L'exécution de Docker avec le mode interactif peut résoudre le problème.
Voici l'exemple pour exécuter l'image avec et sans mode interactif
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker run -d -t -i test_again1.0 b6b9a942a79b1243bada59db19c7999cfff52d0a8744542fa843c95354966a18
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker ps
NOMS DE PORTS D'ÉTAT CRÉÉS PAR COMMANDE D'IMAGE ID DE CONTENANT
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker run -d -t -i test_again1.0 bash c3d6a9529fd70c5b2dc2d7e90fe662d19c6dad8549e9c812fb2b7ce2105d7ff5
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker ps
NOM DES PORTS D'ÉTAT CRÉÉS PAR COMMANDE D'IMAGE ID CONTENANT c3d6a9529fd7 test_again1.0 "bash" Il y a 2 secondes Jusqu'à 1 seconde awesome_haibt
la source
si vous souhaitez opérer sur le conteneur, vous devez l'exécuter au premier plan pour le maintenir en vie.
la source
L'ordonnance d'argument est importante
La réponse de Jersey Beans (les 3 exemples) a fonctionné pour moi. Après pas mal de tâtonnements, j'ai réalisé que l'ordre des arguments importait.
Maintient le conteneur en cours d'exécution en arrière-plan:
docker run -t -d <image-name>
Maintient le conteneur en cours d'exécution au premier plan:
docker run <image-name> -t -d
Ce n'était pas évident pour moi venant d'un milieu Powershell.
la source