web-dev-qa-db-fra.com

L'instruction CMD Dockerfile quittera le conteneur juste après son exécution.

Je souhaite configurer certaines configurations au démarrage de mon conteneur. J'utilise pour cela des scripts Shell. Mais mon conteneur se fermera dès que mes scripts seront terminés. J'ai essayé avec -d flag/mode détaché, mais il ne s'exécutera jamais en mode détaché.

Ci-dessous mon Dockerfile

FROM ubuntu:14.04

ADD Shell.sh /usr/local/bin/Shell.sh

RUN chmod 777 /usr/local/bin/Shell.sh

CMD /usr/local/bin/Shell.sh

Ci-dessous mon script shell

#!/bin/bash
echo Hello-docker
  1. Courir sans drapeau

    docker run hello-docker
    

    Ceci affichera 'Hello-docker' sur ma console et sortira

  2. Exécuter avec des indicateurs -itd

    docker run -itd hello-docker
    

    et comme ci-dessous la sortie de ma console, cette fois aussi va bientôt sortir. : (enter image description here

    • La différence que j'ai vue est dans la section COMMAND lorsque j'exécute une autre section de commande d'images qui affiche "/ bin/bash" et continue en mode détaché.

    • Et lorsque j'exécute mon image dans un conteneur avec la commande Script du shell, la section COMMAND affiche "/ bin/sh -c/usr/loca" et Exit.

    • Je veux exécuter le conteneur jusqu'à ce que je ne l'arrête pas manuellement.

MODIFIER:

Après avoir ajouté l'instruction ENTRYPOINT dans Dockerfile, cela n'exécutera pas mon script Shell :(

FROM ubuntu:14.04

ADD Shell.sh /usr/local/bin/Shell.sh

RUN chmod 777 /usr/local/bin/Shell.sh

CMD /usr/local/bin/Shell.sh

ENTRYPOINT /bin/bash

Selon la documentation de docker ici

CMD sera remplacé lors de l'exécution du conteneur avec des arguments alternatifs. Par conséquent, si j'exécute l'image de menu fixe avec certains arguments comme ci-dessous, n'exécutera pas les instructions CMD. :(

Sudo docker run -it --entrypoint=/bin/bash <imagename>
32
Anand Suthar

Enfin, avec quelques expériences, j'ai obtenu mon meilleur résultat comme ci-dessous

Il n'y a rien de mal avec mon fichier Dockerfile, car ci-dessous, c'est correct.

FROM ubuntu:14.04

ADD Shell.sh /usr/local/bin/Shell.sh

RUN chmod 777 /usr/local/bin/Shell.sh

CMD /usr/local/bin/Shell.sh

Ce que je fais pour obtenir le résultat escompté, c’est que j’ajoute une commande supplémentaire (/ bin/bash) dans mon fichier de script Shell, comme indiqué ci-dessous, et tout fonctionne comme prévu de la meilleure façon possible.

#!/bin/bash

echo “Hello-docker” > /usr/hello.txt

/bin/bash
18
Anand Suthar

Un conteneur Docker fonctionnera aussi longtemps que le fichier CMD de votre fichier Docker sera pris.

Dans votre cas, votre CMD consiste en un script Shell contenant un seul écho. Le conteneur va donc sortir une fois l'écho terminé.

Vous pouvez remplacer CMD, par exemple:

Sudo docker run -it --entrypoint=/bin/bash <imagename>

Cela créera un shell interactif dans votre conteneur au lieu d’exécuter votre CMD. Votre conteneur quittera dès que vous quitterez ce Shell.

Si vous voulez que votre conteneur reste actif, vous devez vous assurer que votre CMD continue de fonctionner. Par exemple, en ajoutant la ligne while true; do sleep 1; done à votre fichier Shell.sh, votre conteneur imprimera votre message hello, puis ne fera plus rien jusqu'à ce que vous l'arrêtiez (en utilisant docker stop dans un autre terminal).

Vous pouvez ouvrir un shell dans le conteneur en cours d'exécution à l'aide de docker exec -it <containername> bash. Si vous exécutez ensuite la commande ps ax, elle vous indiquera que votre fichier Shell.sh est toujours en cours d'exécution dans le conteneur.

19
NZD

Vous pouvez également modifier votre premier fichier Docker, en remplaçant

CMD /usr/local/bin/Shell.sh

par

CMD /usr/local/bin/Shell.sh ; sleep infinity

De cette façon, votre script ne se termine pas et votre conteneur continue à s'exécuter.

15
user2915097
CMD bash -C '/path/to/start.sh';'bash'
2
lanni654321

Au début, Shell ajoute un code de ligne: tail -f /dev/null ou /bin/bash pour s’assurer que vous avez bien exécuté Shell et suspendez un processus dans le système afin que le conteneur de menu fixe ne s’arrête pas. N'oubliez pas de donner "chmod + x" accès à start.sh. il y a démo:

#!/bin/bash
cp /root/supervisor/${RUN_SERVICE}.ini /etc/supervisor/conf.d/
sleep 1
service supervisor start
/bin/bash
1
ghostyusheng