Як запустити 2 команди за допомогою docker exec


84

Мені потрібно виконати 2 команди за допомогою docker exec. Я копіюю файл із контейнера докера і не хочу мати справу з обліковими даними, щоб використовувати щось на зразок ssh. Ця команда копіює файл:

sudo docker exec boring_hawking tar -cv /var/log/file.log | tar -x

Але він створює підкаталог var / log, я хочу цього уникнути, тому, якщо я зможу зробити це в контейнері докера, я повинен бути хорошим:

cd /var/log ; tar -cv ./file.log

Як я можу змусити докер exec запускати 2 команди?

Відповіді:


136

Це призвело до відповіді: Втеча символу в командному рядку Docker Я закінчив робити це:

sudo docker exec boring_hawking bash -c 'cd /var/log ; tar -cv ./file.log' | tar -x

Отже, це працює, виконуючи одну команду bash з параметром, який є 2 командами, які я хочу виконати.


Щиро дякую, це мені дуже допомагає
UnSaid

Якщо у вас є подвійні котирування всередині команди, то ви можете зробити , як , наприклад , -c "cd /var/log; tar -cv \"$1\""якщо файл знаходиться на параметр 1.
зет

27

Досить часто необхідність декількох команд полягає у зміні робочого каталогу - як у запитанні OP.

Для цього у docker тепер є -wможливість вказати робочий каталог. Наприклад, у цій справі

docker exec -w /var/log boring_hawking tar -cv ./file.log

Дійсно корисно, це шлях.
TortelliEngineer

це саме те, що я шукав!
Клей Мітчелл

11

Для всіх, хто натрапляє на це і хоче інший спосіб вказати декілька команд для виконання більш складного сценарію:

cat <<EOF | docker exec --interactive boring_hawking sh
cd /var/log
tar -cv ./file.log
EOF

Це дуже приємне для читання рішення, коли ви хочете виконати більш складний сценарій. Це заслуговує на більшу кількість голосів;)
Слава Фомін II

Я отримую the input device is not a TTYпомилку з цим методом
Рой Шилкрот,

Це --interactiveповинно подбати про це, якщо це не так, то я не впевнений, що відбувається, не маючи більш широкого контексту того, як ви цим користуєтесь.
zbrunson

6

Якщо хтось інший прийшов сюди за чудовою відповіддю, але також хоче кращого способу вирішити вихідну проблему OP (OP OP ..?), Щоб скопіювати файл із контейнера докера, тепер існує docker cpкоманда, яка зробить це: https: //docs.docker.com/engine/reference/commandline/cp/


приємно, по-справжньому приємно
Solx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.