Как запустить 2 команды с помощью docker exec


89

Мне нужно запустить 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

Как я могу заставить docker exec запускать 2 команды?

Ответы:


138

Это привело к ответу: escape-символ в командной строке 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.
zed

28

Довольно часто для смены рабочего каталога требуется несколько команд - как в вопросе OP.

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

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

Действительно полезно, это правильный путь.
TortelliEngineer

это именно то, что я искал!
Клей Митчелл

13

Для всех, кто наткнется на это и хочет, чтобы другой способ указать несколько команд для выполнения более сложного сценария:

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.