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.
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"
Vous pouvez le faire de plusieurs manières:
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
Passez l'argument entier à/bin/bash:
docker run image /bin/bash -c "cd /path/to/somewhere; python a.py"
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.
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.
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"