dockerexecで2つのコマンドを実行する方法


89

dockerexecで2つのコマンドを実行する必要があります。Dockerコンテナからファイルをコピーしていますが、sshなどを使用するために資格情報を処理する必要はありません。このコマンドはファイルをコピーします:

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

しかし、それはサブディレクトリvar / logを作成します、私はそれを避けたいので、dockerコンテナでこれらを行うことができれば私は良いはずです:

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

docker execに2つのコマンドを実行させるにはどうすればよいですか?

回答:


138

これは答えにつながりました: Dockerコマンドラインのエスケープ文字 私はこれを行うことになりました:

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

つまり、実行したい2つのコマンドであるパラメーターを使用して1つのbashコマンドを実行することで機能します。


どうもありがとうございました、これは私に大いに役立ちます
UnSaid 2017

あなたは、コマンド内の二重引用符を持っている場合は、次のような行うことができます-c "cd /var/log; tar -cv \"$1\""ファイルがでている場合は、パラメータ1
ZED

28

多くの場合、OPの質問のように、いくつかのコマンドが必要なのは、作業ディレクトリを変更することです。

そのために、dockerに-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

これは、より複雑なスクリプトを実行する場合に非常に読みやすいソリューションです。それはもっと多くの賛成票に値する;)
Slava FominII19年

私は取得していますthe input device is not a TTY。この方法ではエラーが
ロイShilkrot

がそれ--interactiveを処理することになっていますが、そうでない場合は、これをどのように使用しているかについてより広いコンテキストがないと、何が起こっているのかわかりません。
zbrunson

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.