为什么我的 docker 实际上没有记录任何内容?

Way*_*ner 5 logging docker

我有以下 python 文件:

 import time
 from datetime import datetime


 while True:
     time.sleep(1)
     print(datetime.now())
Run Code Online (Sandbox Code Playgroud)

我已将其添加到 Dockerfile 中:

FROM python:3.7


WORKDIR /test
COPY test.py /test/
CMD ["python", "test.py"]
Run Code Online (Sandbox Code Playgroud)

如果我构建这个并运行

sudo docker run -it --name test myimage
Run Code Online (Sandbox Code Playgroud)

一切都很棒。大约每秒打印一次当前时间。

另一方面,如果我运行它:

sudo docker run -d --name test myimage
Run Code Online (Sandbox Code Playgroud)

它会跑到后台,但如果我这样做......

sudo docker logs test
Run Code Online (Sandbox Code Playgroud)

我什么也得不到!不是什么该死的事情。

任何线索为什么会发生这种情况,或者我怎样才能弄清楚?当我使用时-d和不运行时docker inspect它都会给我"Type": "json-file", "Config": {}

我在 Ubuntu 18.04 上运行 Docker 18.06.1-ce,构建 e68fc7a。

BMi*_*tch 4

如果没有附加 tty,Python 可能会缓冲标准输出。有很多方法可以解决这个问题,包括将此更改添加到您的脚本中:

print(datetime.now(), flush=True)
Run Code Online (Sandbox Code Playgroud)

或者,无需更改脚本,您可以运行stdbuf以关闭输出缓冲:

CMD ["stdbuf", "-oL", "python", "test.py"]
Run Code Online (Sandbox Code Playgroud)

  • 因为我使用了另一个命令(即我的例子中的“waitress-serve”),所以我将“ENV PYTHONUNBUFFERED certain”添加到我的 Dockerfile 中(它可以是任何非空字符串,FWIW) (2认同)