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"