次の単純な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 -t
Dockerはコンテナの端末をエミュレートするために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
。