web-dev-qa-db-ja.com

Python dockerで分離して実行すると、アプリは何も印刷しません

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
99
jpdus

最後に、 GitHub にある@ahmetalpbalkanのおかげで、Dockerでデーモン化された実行時にPython出力を表示するソリューションを見つけました。さらに参考のためにここで自分で答える:

バッファなしの出力を使用する

CMD ["python","-u","main.py"]

の代わりに

CMD ["python","main.py"]

問題を解決します。出力(両方、stderrおよびstdout)を見ることができます

docker logs myapp

今!

169
jpdus

私の場合、Pythonを-uで実行しても何も変わりませんでした。ただし、トリックを行ったのは、PYTHONUNBUFFERED=0を環境変数として設定することでした。

docker run --name=myapp -e PYTHONUNBUFFERED=0 -d myappimage
53
Victor

私にとっては、バグではなく機能です。擬似TTYがなければ、標準化することは何もありません。そのため、単純な解決策は、実行中のコンテナに擬似TTYを割り当てることです:

$ docker run -t ...
14
Peter Senna

簡単な修正として、これを試してください:

from __future__ import print_function
# some code
print("App started", file=sys.stderr)

これは、同じ問題が発生したときに機能します。しかし、正直なところ、このエラーが発生する理由はわかりません。

0
Vitaly Isaev