私はこのようにMULTIPLEコマンドを実行しようとしています。
docker run image cd /path/to/somewhere && python a.py
しかし、これは "No such file or directory"というエラーを出します。
"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文字に関するヒントは見つかりませんでした。
Dockerで複数のコマンドを実行するには、/bin/bash -c
とセミコロン;
を使用します。
docker run image /bin/bash -c "cd /path/to/somewhere; python a.py"
Command1(cd)が0(エラーなし)の終了ステータスを返した場合にだけcommand2(python)が実行される必要がある場合は、&&
の代わりに;
を使用してください。
docker run image /bin/bash -c "cd /path/to/somewhere && python a.py"
これにはいくつかの方法があります。
作業ディレクトリーを変更するには、-wオプションを使用します。
-w、--workdir = ""コンテナ内の作業ディレクトリ
https://docs.docker.com/engine/reference/commandline/run/#set-working-directory--w
引数全体を/ bin/bashに渡します。
docker run image /bin/bash -c "cd /path/to/somewhere; python a.py"
Dockerコンテナ内でコマンドをパイプすることもできます。例えば、bash -c "<command1> | <command2>"
。
docker run img /bin/bash -c "ls -1 | wc -l"
しかし、リモートでシェルを呼び出さずに、出力はローカル端末にリダイレクトされます。
docker-compose
で同じことをしたいと思っている他の人のためには、bash -c
を追加し、&&
と一緒に結合された複数のコマンドを引用符で囲む必要があります。
そのため、OPの例ではdocker-compose run image bash -c "cd /path/to/somewhere && python a.py"
ローカルマシンのコンテナの外側の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
で利用可能になるでしょう。