次の簡単な例(app.rb)とそれ以上のものがあれば
# -*- coding: utf-8 -*-
require 'sinatra'
set :bind, '0.0.0.0'
puts "WOOT a puts statement was HERE"
get '/' do
"hello world"
end
経由でこれを実行するbundle exec ruby app.rb
putsステートメントと予想されるsinatraの動作の両方をレンダリングします。
ただし、同じ実行コマンドを使用してDockerコンテナー内で同じコードを実行すると、Sinatra出力のみが表示されます。 putsステートメントがレンダリングされることはありません。
ただし、「puts」ステートメント以外のすべてにコメントを付けてdockerで実行すると、putsステートメントは正しくレンダリングされます。 Dockerの動作の違いは、sinatraが必要かどうかに依存しているようです。
ここで簡単なものが欠けているようです。 何か案は?
@singramこれは、IOがDockerコンテナにバッファリングされる方法に関係していると確信しています。 スニペットの先頭にputs "here"
を追加すると、両方のステートメントが出力されることがわかります。
ファイルの先頭近くに$stdout.sync = true
設定すると、問題が解決しました。
ありがとう! それは私にとってもトリックでした( $stdout.sync = true
)。 他の人のためにどこかにドキュメントにあると便利でしょう。
私の感謝も共有したかっただけです! $stdout.sync = true
はプットのために働いた。 今日はstdoutフラッシュについても学びました。 乾杯!
最も参考になるコメント
ファイルの先頭近くに
$stdout.sync = true
設定すると、問題が解決しました。