docker run <イメージ> <複数のコマンド>


255

このような複数のコマンドを実行しようとしています。

docker run image cd /path/to/somewhere && python a.py

しかし、これは次のように解釈されるため、「そのようなファイルまたはディレクトリはありません」というエラーが発生します...

"docker run image cd /path/to/somewhere" && "python a.py"

""や()などのエスケープ文字が必要なようです。

だから私も試しました

docker run image "cd /path/to/somewhere && python a.py"
docker run image (cd /path/to/somewhere && python a.py)

しかし、これらは機能しませんでした。

Docker Run Referenceを検索しましたが、ESCAPE文字に関するヒントは見つかりませんでした。

回答:


440

dockerで複数のコマンドを実行するには/bin/bash -c、セミコロンを使用します;

docker run image_name /bin/bash -c "cd /path/to/somewhere; python a.py"

command1(cd)がゼロ(エラーなし)の終了ステータスを返した場合にのみ、command2(python)が実行される必要がある場合は、&&代わりに;

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
この回答が、hereドキュメントを使用してコマンドをコンテナにフィードする方法に興味があるとわかった場合は、こちらのhereドキュメントに関する別の質問に対する私の回答です。お気軽にチェックしてください
Kohányiロバート

14
docker run alpine sh -c "ls | wc >> xxx"これは、bashが利用できない場合に非常に役立ちます。
Eddy Hernandez

1
これは機能しますcdが、戻りコードが重要な場合はunix.stackexchange.com/questions/37069/…;と同じではありません&&
Nick Zalutskiy

1
ありがとう@NickZalutskiy、コメントで更新された回答
anhlc '31年

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

結果をコンテナーの外の1つのファイル(ローカルマシン)に保存する場合は、次のようにします。

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ます&&

OPの例では docker-compose run image bash -c "cd /path/to/somewhere && python a.py"


これは私にとっては
うまくいきました

そして、どうすればそのようなドッカープロセスを終了できますか?ctrl Cまたはctrl Zを押すか、exitと入力しても機能しないか、docker stopコマンドで強制終了する必要がありますか?
node_man

動作しdocker-compose down [service-name]ないか?(そして、あなたを歓迎している心配はありません、喜んでお手伝いします:))
S ..

2

@Eddy Hernandezのコメントから適切な回答をするだけで、Alpineにはbashではなくashが付属しているため、これは非常に正しいです。

ここでの質問は、Docker Alpineコンテナーでのシェルの起動に関するもので、sh or ashまたは/bin/shor を使用することを意味し/bin/ash/ます。

OPの質問に基づく:

docker run image sh -c "cd /path/to/somewhere && python a.py"


1

bash -c実行しているコマンドが比較的単純な場合にうまく機能します。ただし、制御文字でいっぱいの長い一連のコマンドを実行しようとすると、複雑になる可能性があります。

私はコマンドを外部からプロセスにパイプすることでこれをうまく回避しました、すなわち

cat script.sh | docker run -i <image> /bin/bash

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