web-dev-qa-db-fra.com

docker run <IMAGE> <MULTIPLE COMMANDS>

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

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

Mais cela me donne l'erreur "Aucun fichier ou répertoire de ce type" car il est interprété comme ...

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

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

Alors j'ai 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 cherché référence d'exécution Docker mais je n'ai trouvé aucun indice concernant les caractères ESCAPE.

195
ai0307

Pour exécuter plusieurs commandes dans le menu fixe, utilisez /bin/bash -c et un point-virgule ;.

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

Dans le cas où nous aurions besoin de commande2 (python) sera exécutée si et seulement si command1 (cd) renvoyait zéro (pas d'erreur) état de sortie, utilisez && au lieu de ;.

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

Vous pouvez le faire de plusieurs manières:

  1. Utilisez l'option -w pour changer 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"
    
26
John Petrone

Vous pouvez également diriger les commandes dans le 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.

7
USER_1

Si vous souhaitez stocker le résultat dans un fichier hors du conteneur, sur votre ordinateur local, vous pouvez procéder de la sorte.

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 dans /tmp/result.txt sur votre ordinateur local.

2
Flamarion

Pour tous ceux qui sont venus ici et qui souhaitent faire la même chose avec docker-compose, il vous suffit de préfixer bash -c et de placer plusieurs commandes entre guillemets, jointes à &&.

Donc, dans l'exemple des opérations d'exploitation docker-compose run image bash -c "cd /path/to/somewhere && python a.py"

1
S..