web-dev-qa-db-fra.com

Comment puis-je garder le conteneur docker actif?

Je veux exécuter plusieurs conteneurs automatiquement et créer quelque chose,

mais certaines images, telles que swarm, s’arrêteront automatiquement après leur exécution ou leur démarrage.

J'essaye déjà comme ça

docker run -d swarm

docker run -d swarm /bin/bash tail -f /dev/null

docker run -itd swarm bash -c "while true; do sleep 1; done"

mais 'docker ps' ne montre rien, et j'ai essayé de construire Dockerfile en tapant:

FROM swarm
ENTRYPOINT ["echo"]

et l'image ne s'exécute pas avec le message d'erreur suivant:

docker: Error response from daemon: invalid header field value "oci runtime error: container_linux.go:247: starting container process caused \"exec: \\\"echo\\\": executable file not found in $PATH\"\n".

Je ne comprends pas cette erreur ... Comment puis-je garder le conteneur Swarm en cours d'exécution?

(Désolé mon anglais n'est pas bon))

5
haeney

Tout d’abord, vous ne voulez pas mélanger les commutateurs -i et -d. Soit vous souhaitez exécuter le conteneur en mode interactif ou détaché. Dans votre cas en mode détaché:

docker run -d swarm /bin/bash tail -f /dev/null

Il n'est pas non plus nécessaire d'allouer un terminal en utilisant l'indicateur -t, car cela doit uniquement être effectué en mode interactif.

Vous devriez jeter un coup d'œil au Docker run reference

6
Cyclonecode

il est recommandé d’utiliser -d car vous pouvez exécuter votre conteneur avec une seule commande et vous n’aurez pas besoin de détacher le terminal du conteneur en appuyant sur Ctrl + P + Q.

Cependant, il existe un problème avec l'option -d. Votre conteneur s'arrête immédiatement sauf si les commandes ne sont pas exécutées au premier plan. Docker requiert que votre commande continue à courir au premier plan. Sinon, vos applications s’arrêteront et arrêteront le conteneur.

Le problème est que certaines applications ne s'exécutent pas au premier plan.

Dans cette situation, vous pouvez ajouter tail -f/dev/null à votre commande . En procédant ainsi, même si votre commande principale s'exécute en arrière-plan, votre conteneur ne s'arrête pas car tail continue à s'exécuter au premier plan.

docker run -d swarm tail -f/dev/null

docker ps montre un conteneur

Vous pouvez maintenant attacher votre conteneur en utilisant docker exec nom_conteneur

ou 

docker run -d commande swarm tail -f/dev/null

5
Navin a.s

Cela ne pose pas de problème avec/dev/null, mais pourquoi ne pas lui faire faire quelque chose d’utile?

La commande suivante récoltera des processus orphelins, il ne restera donc pas de processus de zombie (obsolète) en suspens. De plus, certains scripts init.d/restart ne le permettent pas.

exec sh -c 'while true ;do wait ;done'
0
TheMadsen

En gros, c’est la méthode, mais votre image de docker est swarm, donc elle est différente et je ne connais pas l’image de swarm darmer et je ne l’utilise pas. Mais après que j’ai effectué une recherche à ce sujet. D'abord, je lance l'image de l'essaim de docker que cela montre.,

 enter image description here

Après cela, je comprends que nous exécutons l'image de Docker Swarm en utilisant seulement cinq commandes dans l'image, telles que créer, gérer, lister, aider. si nous exécutons swarm image sans commande comme docker run -itd swarm il prend la commande sous la forme --help. Désolé, mais je ne sais pas quel est le but de l'image de l'essaim. Pour plus d’utilisation, consultez https://hub.docker.com/_/swarm/

La réponse que j’ai ajoutée docker exécuter -itd image tail -f/dev/null n’est pas pour swarm image, c’est pour des images docker comme Ubuntu, Fedora, Centos.

Il suffit de lire l'utilisation de l'image de l'essaim et pourquoi elle est utilisée.

Après si vous avez un problème, postez votre problème dans https://github.com/docker/swarm-library-image/issues

Je vous remercie...

0
Navin a.s

Vous avez raison docker run -itd swarm (Sans donner d'argument pour container (bash -c "tant que vrai; sommeil 1; done")) fonctionne correctement. Si vous passez l'argument pour l'exécution de docker, la commande sera exécutée et termine le conteneur. Si vous souhaitez exécuter le conteneur de manière permanente, commencez par le démarrer avec docker run -itd swarm et vérifiez si le conteneur s'exécute ou non avec docker ps le conteneur s'exécute maintenant, si vous le souhaitez. exécuter n'importe quelle commande du conteneur, utilisez docker exec -itd nom_conteneur commande N'oubliez pas: utilisez uniquement la commande qui n'arrête pas le conteneur. bash -c "tant que true; veille 1; done cette commande arrêtera le conteneur (étant donné que cette commande est complète si elle est exécutée dans un terminal normal, elle est exécutée et terminée, ce type de commande termine également le conteneur).

J'espère que ça aide..

0
Navin a.s