Как запустить 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 команды?

Solx
источник

Ответы:

138

Это привело к ответу: escape-символ в командной строке Docker. В итоге я сделал следующее:

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

Таким образом, он работает, как бы, выполняя одну команду bash с параметром, который представляет собой 2 команды, которые я хочу запустить.

Solx
источник
Большое спасибо, это мне очень помогает
UnSaid
Если внутри команды есть двойные кавычки, то вы можете сделать это, -c "cd /var/log; tar -cv \"$1\""если файл находится в параметре 1.
zed
28

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

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

docker exec -w /var/log boring_hawking tar -cv ./file.log
P-Gn
источник
Действительно полезно, это правильный путь.
TortelliEngineer
это именно то, что я искал!
Клей Митчелл
13

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

cat <<EOF | docker exec --interactive boring_hawking sh
cd /var/log
tar -cv ./file.log
EOF
Zbrunson
источник
Это очень удобное для чтения решение, если вы хотите выполнить более сложный сценарий. Он заслуживает большего количества голосов;)
Слава Фомин 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