python – 没有’-it’运行容器时,只出现一行SimpleHTTPServer
注意:我不是要在这里解决实际项目中的任何问题.这个问题仅用于理解我在下面第二个实验(实验2)中看到的结果背后的原因. 这些实验是在macOS High Sierra 10.13.1上的macOS终端版本2.8上使用Docker版本17.12.0-ce进行的. 实验1:docker使用-it选项运行SimpleHTTPServer 这是我的Dockerfile:
我构建它并使用此命令运行它:
在另一个终端中,我使用以下命令测试容器:
curl命令产生预期结果:目录列表.在运行docker run的终端中,我看到了这个预期的输出.
最后,按Ctrl C停止此docker容器. 实验2:docker运行SimpleHTTPServer而不使用-it选项 现在我用这个命令运行相同的pyhttp图像:
即使容器正在运行,终端上也不会出现输出.我没有在0.0.0.0端口8000 …消息上看到预期的服务HTTP. 虽然如果我使用curl http:// localhost:8000 /测试容器,我会看到运行docker run的终端中出现GET请求的日志.
问题:为什么不显示0.0.0.0端口8000上的初始服务HTTP …消息,但会出现HTTP请求的后续日志? 实验3:docker运行没有-it选项的Flask app 我构建它并使用此命令运行它:
在另一个终端中,我使用以下命令测试容器:
在运行docker run的终端中,我看到了这个预期的输出.
问题:为什么仅在实验2中,0.0.0.0端口8000上的服务HTTP …消息没有出现? python -m SimpleHTTPServer的第一行输出打印到stdout;其余的行打印到stderr.考虑这些调用之间的区别:
第二个没有显示“服务”行,因为stdout被丢弃,但两者都显示日志行,因为stderr不是.另一方面,Flask将其“开始”日志写入stderr(以及更多日志行):
(从这里编辑)你的docker调用python发生了什么,没有-t选项,stdout是完全缓冲的,并且使用-t选项,它是行缓冲的,因此它会在每个换行符后立即出现.
我仍然在寻找一个明确的来源(this article看起来很有希望),但似乎当sys.stdout.isatty()为True时,python以行缓冲模式打开stdout,因此每行显示为打印出来,但是当它不是时,它会以完全缓冲模式打开,因此仅在缓冲区已满时打印输出. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |