2016-01-06 399 views
23

我想爲我的服務器做一些簡單的日誌記錄,這是一個在Docker容器中運行的小型Flask應用程序。重定向docker中的命令輸出

這裏是Dockerfile

# Dockerfile 
FROM dreen/flask 
MAINTAINER dreen 
WORKDIR /srv 

# Get source 
RUN mkdir -p /srv 
COPY perfektimprezy.tar.gz /srv/perfektimprezy.tar.gz 
RUN tar x -f perfektimprezy.tar.gz 
RUN rm perfektimprezy.tar.gz 

# Run server 
EXPOSE 80 
CMD ["python", "index.py", "1>server.log", "2>server.log"] 

正如你可以在最後一行我重定向stderr和標準輸出到一個文件中看到。現在我運行這個容器和外殼進去

docker run -d -p 80:80 perfektimprezy 
docker exec -it "... id of container ..." bash 

,並注意以下事項:

服務器正在運行,該網站工作

沒有/srv/server.log

ps aux | grep python產量:

root   1 1.6 3.2 54172 16240 ?  Ss 13:43 0:00 python index.py 1>server.log 2>server.log 
root  12 1.9 3.3 130388 16740 ?  Sl 13:43 0:00 /usr/bin/python index.py 1>server.log 2>server.log 
root  32 0.0 0.0 8860 388 ?  R+ 13:43 0:00 grep --color=auto python 

但是那裏e沒有日誌...但是,如果我的容器我docker attach我可以看到應用程序生成控制檯輸出。

使用Docker時,如何正確地將stdout/err重定向到文件?

回答

23

當您在Dockerfile中指定一個作爲CMD的JSON列表時,它不會在shell中執行,因此通常的shell函數(如stdout和stderr重定向)將不起作用。

documentation

的EXEC形式被解析爲一個JSON陣列,這意味着必須使用雙引號(")圍繞詞語不單引號(')。

與shell窗體不同,exec窗體不會調用命令shell。這意味着正常的shell處理不會發生。例如,CMD [ "echo", "$HOME" ]將不會在$HOME上進行變量替換。如果您想要進行shell處理,則可以使用shell窗體或直接執行shell,例如:CMD [ "sh", "-c", "echo", "$HOME" ]

你的命令實際上做的是執行你index.py腳本,並通過字符串"1>server.log""2>server.log"作爲命令行參數成Python腳本。而不是下面的

使用(二者均應該工作):

  1. CMD "python index.py > server.log 2>&1"
  2. CMD ["/bin/sh", "-c", "python index.py > server.log 2>&1"]
+0

另請參閱https://github.com/docker/docker/issues/7440 – user2915097

+2

[documentation](https://docs.docker。com/engine/reference/builder /#shell-form-entrypoint-example)建議使用內置的'exec' shell來使容器符合OS信號和'docker stop'。所以第一個命令變成:'CMD exec python index.py> server.log 2>&1' – lucian

4

只是一個補充,使用當搬運工,撰寫,你也可以嘗試:

command: bash -c "script_or_command > /path/to/log/command.log 2>&1"

+0

你試過了嗎?這對我來說非常有意義,並且不起作用!到目前爲止,當使用docker-compose'command'指令時,我完全不成功將stderr重定向到stdout。標準輸出通過罰款。 –

+0

是的,它對我來說非常合適。 –

+0

啊,我的問題,原來是我需要設置'PYTHONUNBUFFERED'環境變量或運行蟒蛇用'-u'標誌,因爲這說明:http://stackoverflow.com/a/24183941/562883 –