Окно запуска <IMAGE> <MULTIPLE COMMANDS>


255

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

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, но не нашел никаких подсказок о ESCAPE символах.

Ответы:


440

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

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

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

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

Спасибо за подсказку! Я просто попытался [docker run image "cd / bin; ls"] и получил следующие сообщения об ошибках. [exec: "cd / bin; ls": stat cd / bin; ls: нет такого файла или каталога] [Ответ об ошибке от демона: не
удается

1
Любой, кто найдет этот ответ, может быть заинтересован в том, как использовать здесь документы для подачи команд в контейнер: вот мой ответ на другой вопрос, такой как здесь, здесь документы, не стесняйтесь проверить его .
Коханьи Роберт

14
docker run alpine sh -c "ls | wc >> xxx"это мне очень помогает, когда bash недоступен.
Эдди Эрнандес

1
Это работает, cdно не для вещей, где значения кодов возврата ;не такие, как &&см. Unix.stackexchange.com/questions/37069/…
Ник Залуцкий,

1
Спасибо @NickZalutskiy, обновленный ответ с вашим комментарием
anhlc

31

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

  1. Используйте параметр -w, чтобы изменить рабочий каталог:

    -w, --workdir = "" Рабочий каталог внутри контейнера

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

  2. Передайте весь аргумент в / bin / bash:

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

Нет упоминания --workdirв предоставленной ссылке. Страница, вероятно, переместилась / изменилась. Может быть обновлен до docs.docker.com/engine/reference/run/#workdir или docs.docker.com/engine/reference/commandline/run
marcv

10

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

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

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


3

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

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на вашем локальном компьютере.


2

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

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


у меня это сработало, но процесс docker завершается после выполнения команды
node_man

и как мне выйти из такого процесса докера? нажатие ctrl C или ctrl Z или ввод выхода не работает, или мне нужно убить его командой docker stop?
node_man

это docker-compose down [service-name]не работает или? (и не беспокойтесь, добро пожаловать, с радостью помогу :))
S ..

2

Просто чтобы сделать правильный ответ из комментария @Eddy Hernandez, и это очень правильно, поскольку Alpine идет с пеплом, а не с ударом.

Теперь вопрос касается запуска оболочки в контейнере Docker Alpine, который подразумевает использование shили ashили /bin/shили /bin/ash/.

На основании вопроса ОП:

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


1

bash -cхорошо работает, если команды, которые вы запускаете, относительно просты. Однако, если вы пытаетесь запустить длинную серию команд, заполненных управляющими символами, это может стать сложным.

Я успешно справился с этим путем подачи своих команд в процесс извне, т.е.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.