Docker run <IMAGE> <МНОЖЕСТВЕННЫЕ КОМАНДЫ>

Я пытаюсь запустить MULTIPLE команды, подобные этому.

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

Но это дает мне ошибку "Нет такого файла или каталога", потому что она интерпретируется как...

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

Кажется, что нужны некоторые символы ESCAPE, такие как "" или().

Поэтому я также пробовал

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

но это не сработало.

Я искал Docker Run Reference, но не нашел никаких подсказок об символах ESCAPE.

Ответ 1

Чтобы запустить несколько команд в Docker, используйте /bin/bash -c и точку с запятой ;

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

В случае, если нам нужно, команда2 (python) будет выполнена тогда и только тогда, когда команда1 (cd) вернула ноль (без ошибок) состояния выхода, используйте && вместо ;

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

Ответ 2

Вы можете сделать это несколькими способами:

Ответ 3

Вы также можете bash -c "<command1> | <command2>" команды внутри контейнера Docker, например, bash -c "<command1> | <command2>":

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

Но без вызова оболочки в пульте выход будет перенаправлен на локальный терминал.

Ответ 4

Если вы хотите сохранить результат в одном файле вне контейнера на локальном компьютере, вы можете сделать что-то вроде этого.

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"

Результат ваших команд будет доступен в /tmp/result.txt на вашем локальном компьютере.

Ответ 5

Для всех, кто пришел сюда и хочет сделать то же самое с docker-compose вам просто нужно добавить bash -c и заключить несколько команд в кавычки, соединенные вместе с &&.

Так что в примере с docker-compose run image bash -c "cd/path/to/somewhere && python a.py"