【发布时间】:2018-02-04 10:27:07
【问题描述】:
注意:我并不想在这里解决实际项目中的任何问题。这个问题只是为了理解我在下面的第二个实验(实验 2)中看到的结果背后的原因。
这些实验是在 macOS High Sierra 10.13.1 上的 macOS Terminal 版本 2.8 上使用 Docker 版本 17.12.0-ce 进行的。
实验 1:docker run SimpleHTTPServer 和 -it 选项
这是我的Dockerfile:
FROM python:2.7-slim
CMD ["python", "-m", "SimpleHTTPServer"]
我用这个命令构建并运行它:
docker build -t pyhttp .
docker run -it -p 8000:8000 pyhttp
在另一个终端中,我使用以下命令测试容器:
curl http://localhost:8000/
curl 命令产生预期的结果:目录列表。在运行 docker run 的终端中,我看到了这个预期的输出。
$ docker run -it -p 8000:8000 pyhttp
Serving HTTP on 0.0.0.0 port 8000 ...
172.17.0.1 - - [04/Feb/2018 10:07:33] "GET / HTTP/1.1" 200 -
最后,我按下 Ctrl + C 停止这个 docker 容器。
实验 2:docker run SimpleHTTPServer 没有 -it 选项
现在我用这个命令运行相同的pyhttp 图像:
docker run -p 8000:8000 pyhttp
即使容器正在运行,终端上也不会出现任何输出。我没有看到预期的 Serving HTTP on 0.0.0.0 port 8000 ... 消息。
尽管如果我使用curl http://localhost:8000/ 测试容器,我会看到GET 请求的日志出现在运行docker run 的终端中。
$ docker run -p 8000:8000 pyhttp
172.17.0.1 - - [04/Feb/2018 10:12:41] "GET / HTTP/1.1" 200 -
问题:为什么最初的Serving HTTP on 0.0.0.0 port 8000 ... 消息没有出现,但是HTTP 请求的后续日志却出现了?
实验 3:docker run Flask 应用没有-it 选项
我用这个命令构建并运行它:
docker build -t flaskapp .
docker run -p 8000:8000 flaskapp
在另一个终端中,我使用以下命令测试容器:
curl http://localhost:8000/
在运行 docker run 的终端中,我看到了预期的输出。
$ docker run -p 8000:8000 flaskapp
* Running on http://0.0.0.0:8000/ (Press CTRL+C to quit)
172.17.0.1 - - [04/Feb/2018 10:22:28] "GET / HTTP/1.1" 200 -
问题:为什么只在实验2中没有出现Serving HTTP on 0.0.0.0 port 8000 ...消息?
【问题讨论】:
-
我认为这取决于服务器如何写入这些日志。
-
@aerokite 能否详细说明它依赖于哪些方面或写日志的机制?当容器在没有
-it选项的情况下运行时,服务器可能会做什么导致日志不出现?另外,为什么服务器的其他日志会出现在同一个容器中? -
@LoneLearner,您能否检查一下您是否遇到此处描述的问题tarunlalwani.com/post/why-delayed-output-python-docker?
-
@TarunLalwani 看来我面临同样的问题。虽然
python --help说-u: unbuffered binary stdout and stderr,但我看到这个问题只发生在stdout(Serving HTTP on 0.0.0.0 port 8000 ...消息)而不是stderr(GET请求日志)。事实上,将Dockerfile中的CMD指令修改为CMD ["python", "-u", "-m", "SimpleHTTPServer"]可以解决此问题。
标签: python docker httpserver