2015-04-16 107 views
42

運行超脫我這是在我的dockerfile開始一個Python(2.7)的應用程序:Python應用程序不打印任何東西當搬運工

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

main.py打印一些字符串,當它啓動並進入成一個圈算賬:

print "App started" 
while True: 
    time.sleep(1) 

只要我開始使用 - 它標誌的集裝箱,一切正常:

$ 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) 

任何想法什麼問題呢?在後臺運行時,「打印」行爲是否有所不同?

泊塢版本:

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 

回答

57

最後,我發現了一個解決方案,在Docker中運行守護進程時查看Python輸出,這要歸功於@ahmetalpbalkan在GitHub之上。這裏回答它自己以備將來參考:

使用無緩衝輸出,

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

,而不是

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

解決了這個問題;你可以通過

docker logs myapp 

現在看到輸出(stderr和stdout)!

+1

-u似乎爲我工作,但有沒有一些文件的地方與它實際上做什麼的描述? –

+0

正如其他答案所示,如果'-u'標誌不起作用,你可以嘗試設置環境變量'ENV PYTHONUNBUFFERED = 0'。 –

+0

這也是我的問題。有關更詳細的解釋,請參閱http://stackoverflow.com/a/24183941/562883 –

0

作爲速戰速決,試試這個:

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

這對我的作品時,我遇到了同樣的問題。但是,說實話,我不知道爲什麼這個錯誤會發生。

+0

感謝您的提示!試圖用你的版本替換所有的打印,不幸的是它並沒有爲我工作,仍然無法通過碼頭日誌得到任何輸出(在sys.stderr/sys.stdout沒有可見的結果之間進行更改)。這是一個碼頭錯誤? – jpdus

17

在我的情況下,運行Python -u沒有改變任何東西。什麼做的伎倆,然而,設置PYTHONUNBUFFERED=0作爲一個環境變量:

docker run --name=myapp -e PYTHONUNBUFFERED=0 -d myappimage 
+2

在我的情況下,添加'-e PYTHONUNBUFFERED = 0'有幫助。 –

+0

謝謝!我把頭從牆上撞了幾個小時,甚至用'-u'也無法登錄。你的解決方案在Django上爲我在Docker for Mac上修復了這個問題 – Someguy123

3

對我來說這是一個功能,而不是一個錯誤。沒有僞TTY,沒有任何標準。因此,一個簡單的解決方案是爲您的運行容器分配僞TTY:

$ docker run -t ... 
+0

這並沒有提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 –

+0

@JamesKPolk,現在好點了嗎? –

+0

好得多,謝謝你的改進。 –