запустити докер <IMAGE> <МНОГО КОМАНДИ>


254

Я намагаюся запустити МНОГО таких команд.

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

Відповіді:


439

Для запуску декількох команд у докері використовуйте /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: немає такого файлу чи каталогу] [Відповідь про помилку від демон: Неможливо запустити контейнер]
ai0307

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

14
docker run alpine sh -c "ls | wc >> xxx"це мені дуже допомагає, коли bash недоступний.
Едді Ернандес

1
Це працює, cdале не для речей, для яких значення коду повернення ;не те саме, що &&див. Unix.stackexchange.com/questions/37069/…
Nick

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"


цей працював на мене, але процес
докера

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

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

2

Просто, щоб зробити належну відповідь з коментаря @Eddy Ернандеса, і це дуже правильно, оскільки Alpine поставляється з попелом, а не лускати.

Тепер питання referes до Запуск оболонки в Docker альпійської контейнері , який має на увазі використання 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.