web-dev-qa-db-fra.com

Exécution d'un script dans un conteneur de menu fixe à l'aide d'un script Shell

Je suis nouveau dans la technologie Docker, j'essaie de créer un script Shell pour configurer un conteneur Docker, mon fichier de script ressemble à ce qui suit 

#!bin/bash

docker run -t -i -p 5902:5902 --name "mycontainer" --privileged myImage:new /bin/bash

L'exécution de ce fichier de script exécutera le conteneur dans un bash récemment appelé.

Maintenant, je dois exécuter un fichier de script (test.sh) qui est déjà dans le conteneur du script Shell indiqué ci-dessus (par exemple: cd /path/to/test.sh && ./test.sh )Comment n'hésitez pas à demander si le scénario n'est pas clair.

53
zappy

Vous pouvez exécuter une commande dans un conteneur en cours d'exécution à l'aide de docker exec [OPTIONS] CONTAINER COMMAND [ARG...]:

docker exec mycontainer /path/to/test.sh

Et pour courir à partir d'une session bash:

docker exec -it mycontainer /bin/bash

Et à partir de là, vous pouvez exécuter votre script ou autre chose. 

74
Javier Cortejoso

En supposant que votre conteneur docker soit opérationnel, vous pouvez exécuter des commandes en tant que:

docker exec mycontainer /bin/sh -c "cmd1;cmd2;...;cmdn"
72
Cyclops

Je cherchais une réponse à cette même question et j'ai trouvé ENTRYPOINT dans la solution Dockerfile pour moi.

Dockerfile

...
ENTRYPOINT /my-script.sh ; /my-script2.sh ; /bin/bash

Maintenant, les scripts sont exécutés lorsque je démarre le conteneur et je reçois l’invite bash une fois les scripts exécutés.

9
tojo

Vous pouvez également monter un répertoire local dans votre image de menu fixe et source le script dans votre .bashrc. N'oubliez pas que le script doit contenir des fonctions, sauf si vous souhaitez qu'il s'exécute sur chaque nouveau shell. (Ceci est obsolète voir la notification de mise à jour.)

J'utilise cette solution pour pouvoir mettre à jour le script en dehors de l'instance de docker. De cette façon, je n'ai pas à réexécuter l'image si des modifications se produisent, je viens d'ouvrir un nouveau Shell. (Suppression de la réouverture d'un shell - voir la notification de mise à jour)

Voici comment vous liez votre répertoire actuel:

docker run -it -v $PWD:/scripts $my_docker_build /bin/bash

Votre répertoire actuel est maintenant lié à /scripts de votre instance de menu fixe.

(Obsolète) Pour enregistrer vos modifications .bashrc, validez votre image de travail avec la commande suivante:

docker commit $container_id $my_docker_build

Mettre à jour

Pour résoudre ce problème et ouvrir un nouveau shell à chaque changement, procédez comme suit:

Dans le fichier docker lui-même, j'ajoute RUN echo "/scripts/bashrc" > /root/.bashrc". Dans zshrc j'exporte le répertoire des scripts dans le chemin. Le répertoire scripts contient maintenant plusieurs fichiers au lieu d'un. Maintenant, je peux appeler directement tous les scripts sans avoir à ouvrir un sous-shell à chaque changement.

En passant, vous pouvez également définir le fichier d’historique en dehors de votre conteneur. De cette façon, il n'est plus nécessaire de s'engager pour un changement radical.

3
Devpool

Regardez aussi les points d’entrée. Vous pourrez utiliser plusieurs CMD https://docs.docker.com/engine/reference/builder/#/entrypoint

1
Boris

Si vous souhaitez exécuter la même commande sur plusieurs instances, procédez comme suit:

for i in c1 dm1 dm2 ds1 ds2 gtm_m gtm_sl; do docker exec -it $i /bin/bash -c "service sshd start"; done
0
DMin