Dockerfileで起動されるPython(2.7)アプリがあります:
CMD ["python","main.py"]
main.py起動時にいくつかの文字列を出力し、その後ループに入ります:
print "App started"
while True:
time.sleep(1)
-itフラグでコンテナを起動する限り、すべてが期待どおりに機能します。
$ docker run --name=myapp -it myappimage
> App started
そして、後でログを介して同じ出力を見ることができます:
$ docker logs myapp
> App started
-dフラグを指定して同じコンテナを実行しようとすると、コンテナは正常に起動しているように見えますが、出力が表示されません。
$ docker run --name=myapp -d myappimage
> b82db1120fee5f92c80000f30f6bdc84e068bafa32738ab7adb47e641b19b4d1
$ docker logs myapp
$ (empty)
しかし、コンテナはまだ実行されているようです。
$ docker ps
Container Status ...
myapp up 4 minutes ...
添付しても何も表示されません。
$ docker attach --sig-proxy=false myapp
(working, no output)
何が間違っているのでしょうか?バックグラウンドで実行した場合、「印刷」の動作は異なりますか?
Dockerバージョン:
Client version: 1.5.0
Client API version: 1.17
Go version (client): go1.4.2
Git commit (client): a8a31ef
OS/Arch (client): linux/arm
Server version: 1.5.0
Server API version: 1.17
Go version (server): go1.4.2
Git commit (server): a8a31ef
最後に、 GitHub にある@ahmetalpbalkanのおかげで、Dockerでデーモン化された実行時にPython出力を表示するソリューションを見つけました。さらに参考のためにここで自分で答える:
バッファなしの出力を使用する
CMD ["python","-u","main.py"]
の代わりに
CMD ["python","main.py"]
問題を解決します。出力(両方、stderrおよびstdout)を見ることができます
docker logs myapp
今!
私の場合、Pythonを-u
で実行しても何も変わりませんでした。ただし、トリックを行ったのは、PYTHONUNBUFFERED=0
を環境変数として設定することでした。
docker run --name=myapp -e PYTHONUNBUFFERED=0 -d myappimage
私にとっては、バグではなく機能です。擬似TTYがなければ、標準化することは何もありません。そのため、単純な解決策は、実行中のコンテナに擬似TTYを割り当てることです:
$ docker run -t ...
簡単な修正として、これを試してください:
from __future__ import print_function
# some code
print("App started", file=sys.stderr)
これは、同じ問題が発生したときに機能します。しかし、正直なところ、このエラーが発生する理由はわかりません。