nohup ...&はdockerスクリプトで期待どおりに機能しません。

nohup ...&はdockerスクリプトで期待どおりに機能しません。

次の単純なDockerfileがあります。

FROM ubuntu:latest
ADD run.sh /run.sh
CMD /run.sh

run.shにはこれがあります(また非常に簡単です)

#!/bin/bash
nohup awk 'BEGIN { while (c++<50) print "y" }' &
sleep 10

bashのdockerでスクリプトを実行すると(つまり、インタラクティブモードでbashコマンドを実行してスクリプトを実行すると)、正常に動作します。 「nohup モード」に切り替わり、出力が nohup.out に正しく表示されます。

ただし、デフォルトのコマンドを使用してDockerコンテナを実行すると、/run.sh出力はまだSTDOUTです。

私は何が間違っていましたか? docker、bashでは動作しますが、インタラクティブモードで実行した場合にのみ機能するのはなぜですか?

答え1

nohupコマンドが端末に送信される場合にのみコマンド出力をリダイレクトします。出力がすでに他の種類のファイル(通常のファイルやパイプなど)に移動している場合、nohupこれは希望と見なされ、リダイレクトされませんnohup.out

デフォルトでは、docker runコマンドはソケットを介して実行されます(ホストシステムを仮想環境に関連付けます - これは通信方式です)。ソケットは端末ではないため、nohupリダイレクトは行われません。

を実行すると、docker run -tDockerはコンテナの端末をエミュレートするためにnohupリダイレクトされますnohup.out。コマンド名を渡さないと、dockerはを使用したかのように動作しますdocker run -t bash

最善の解決策は、コマンドの出力を選択したログファイルに明示的にリダイレクトすることです。 stderrをリダイレクトすることを忘れないでください。そうすれば、彼らがどこに行くのかがわかります。

nohup awk 'BEGIN { while (c++<50) print "y" }' >myscript.log 2>&1 &

答え2

私はDockerについてはよくわかりませんが、nohupそれはユニークな魔法を持っていますコマンド出力リダイレクトについて、場所に応じて別の場所に案内します。それ出力が表示されます。

詳細については、リンクされた回答をご覧ください。そこから正確な答えを見つけることができます。POSIX仕様nohup

関連情報