docker run <IMAGE> <MULTIPLE COMMANDS>

255

J'essaie d'exécuter plusieurs commandes comme celle-ci.

docker run image cd /path/to/somewhere && python a.py

Mais cela me donne une erreur "Aucun fichier ou répertoire" car il est interprété comme ...

"docker run image cd /path/to/somewhere" && "python a.py"

Il semble que certains caractères ESCAPE comme "" ou () soient nécessaires.

J'ai donc aussi essayé

docker run image "cd /path/to/somewhere && python a.py"
docker run image (cd /path/to/somewhere && python a.py)

mais cela n'a pas fonctionné.

J'ai recherché Docker Run Reference mais je n'ai trouvé aucun indice sur les caractères ESCAPE.

ai0307
la source

Réponses:

440

Pour exécuter plusieurs commandes dans le menu fixe, utilisez /bin/bash -cet point-virgule;

docker run image_name /bin/bash -c "cd /path/to/somewhere; python a.py"

Au cas où nous aurions besoin que command2 (python) soit exécuté si et seulement si command1 (cd) retournait un état de sortie nul (pas d'erreur), utilisez à la &&place de;

docker run image_name /bin/bash -c "cd /path/to/somewhere && python a.py"
anhlc
la source
Merci pour votre indice! J'ai simplement essayé [docker run image "cd / bin; ls"] et j'ai reçu les messages d'erreur suivants. [exec: "cd / bin; ls": stat cd / bin; ls: aucun fichier ou répertoire] [Réponse d'erreur du démon: impossible de démarrer le conteneur]
ai0307
1
N'importe qui trouve que cette réponse pourrait être intéressée par la façon d'utiliser ici des documents pour alimenter des commandes dans un conteneur: voici ma réponse à une autre question comme celle-ci sur les documents ici, n'hésitez pas à la vérifier .
Kohányi Róbert
14
docker run alpine sh -c "ls | wc >> xxx"cela m'aide beaucoup lorsque bash n'est pas disponible.
Eddy Hernandez
1
Cela fonctionne pour cdmais pas pour les choses où les codes de retour ;ne sont pas les mêmes que &&voir unix.stackexchange.com/questions/37069/…
Nick Zalutskiy
1
Merci @NickZalutskiy, réponse mise à jour avec votre commentaire
anhlc
31

Vous pouvez le faire de deux manières:

  1. Utilisez l'option -w pour modifier le répertoire de travail:

    -w, --workdir = "" Répertoire de travail à l'intérieur du conteneur

    https://docs.docker.com/engine/reference/commandline/run/#set-working-directory--w

  2. Passez l'argument entier à / bin / bash:

    docker run image /bin/bash -c "cd /path/to/somewhere; python a.py"
    
John Petrone
la source
Aucune mention --workdirdans le lien fourni. La page a probablement bougé / changé. Peut être mis à jour vers docs.docker.com/engine/reference/run/#workdir ou docs.docker.com/engine/reference/commandline/run
marcv
10

Vous pouvez également diriger des commandes à l'intérieur du conteneur Docker, bash -c "<command1> | <command2>"par exemple:

docker run img /bin/bash -c "ls -1 | wc -l"

Mais, sans invoquer le shell dans la télécommande, la sortie sera redirigée vers le terminal local.

USER_1
la source
3

Si vous souhaitez stocker le résultat dans un fichier en dehors du conteneur, dans votre machine locale, vous pouvez faire quelque chose comme ça.

RES_FILE=$(readlink -f /tmp/result.txt)

docker run --rm -v ${RES_FILE}:/result.txt img bash -c "cat /etc/passwd | grep root > /result.txt"

Le résultat de vos commandes sera disponible /tmp/result.txtdans votre machine locale.

Flamarion
la source
2

Pour ceux qui sont venus ici et qui cherchent à faire de même avec docker-composevous, il vous suffit d'ajouter bash -cet de placer plusieurs commandes entre guillemets, jointes avec &&.

Donc, dans l'exemple OPs docker-compose run image bash -c "cd /path/to/somewhere && python a.py"

S ..
la source
celui-ci a fonctionné pour moi, mais le processus docker se
termine
et comment quitter un tel processus de docker? appuyer sur ctrl C ou ctrl Z ou taper exit ne fonctionne pas ou dois-je le tuer par la commande docker stop?
node_man
ne docker-compose down [service-name]fonctionne pas ou? (et pas de soucis vous êtes les bienvenus, heureux de vous aider :))
S ..
2

Juste pour faire une bonne réponse à partir du commentaire de @Eddy Hernandez et qui est très correct car Alpine est livré avec des cendres pas bash.

La question se réfère maintenant au démarrage d'un shell dans le conteneur Docker Alpine qui implique l'utilisation de shou ashou /bin/shou /bin/ash/.

Sur la base de la question du PO:

docker run image sh -c "cd /path/to/somewhere && python a.py"

Nqsir
la source
1

bash -cfonctionne bien si les commandes que vous exécutez sont relativement simples. Cependant, si vous essayez d'exécuter une longue série de commandes pleines de caractères de contrôle, cela peut devenir complexe.

J'ai réussi à contourner cela en canalisant mes commandes dans le processus de l'extérieur, c'est-à-dire

cat script.sh | docker run -i <image> /bin/bash

user2966041
la source