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
Courir sans drapeau
docker run hello-docker
Ceci affichera 'Hello-docker' sur ma console et sortira
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. : (
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>
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
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.
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.
CMD bash -C '/path/to/start.sh';'bash'
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