分離された Docker コンテナー内で実行されている Python アプリケーションでは、print ステートメントを使用すると出力の欠如が発生する場合があります。この問題は、STDOUT ストリームと STDERR ストリームがコンテナ内でバッファリングされている場合に発生します。
Docker の CMD ["python","main.py] を使用して Python アプリ (2.7) を実行する場合"] を実行すると、main.py スクリプトが print "App starting" で初期化され、無限ループに入ります。 -it フラグを使用してコンテナーを観察すると、ターミナルと Docker ログの両方に予期される出力が表示されます。
ただし、-d フラグ (デタッチ モード) を使用すると、コンテナーは起動されますが、予期される出力はログに表示されなくなります。
この動作を解決するには、Python のバッファなし出力オプションを利用できます。 Dockerfile CMD を CMD ["python","-u","main.py"] に変更すると、STDOUT と STDERR のバッファリングが無効になります。これにより、Python はすぐに印刷できるようになり、myapp の docker ログをクエリするときに出力が表示されるようになります。
-u 引数により、Python は、出力を待たずに標準ストリームに出力をフラッシュします。埋めるバッファ。これにより、スクリプトがバックグラウンドで実行されている場合でも、印刷が即座に表示されます。
印刷とは対照的に、ログ モジュールのlogging.warning("text") 関数を使用します。バッファなしモードがなくても即時出力を生成します。これは、ロギングが内部でフラッシュを処理するためです。
-u オプションに関する Python ドキュメントには、STDOUT ストリームと STDERR ストリームの両方のバッファリングが解除され、切り離されたコンテナーでのライブ出力表示が可能になると記載されています。
以上が切り離された Docker Python コンテナに印刷出力が表示されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。