Docker: Python服务器未监听

3
我正在尝试编写一个简单的Python服务器,将JSON中的消息写入文件。当我部署我的Docker容器时,没有任何反应。当我停止容器(使用键盘中断)时,所有控制台输出一次性写入文件并关闭容器。
我的Python代码:
import socketserver
import json

class PoCServer(socketserver.BaseRequestHandler):

    def handle(self):
        addr = self.client_address[0]
        print("[{}] incoming connection...".format(addr))

        buff = bytes()
        while True:
            rawdata = self.request.recv(256)
            if not rawdata: break
            buff = buff + rawdata

        data = json.loads(buff.decode())

        with open("data/" + data["name"] + ".txt", "w") as f:
            f.write(data["msg"])

        print("[{}] file ".format(addr) + data["name"] + ".txt written...")

server =  socketserver.ThreadingTCPServer(("localhost", 10000), PoCServer)
print("[+] server listening...")
server.serve_forever()  

我的Dockerfile:
FROM python

WORKDIR /app

RUN mkdir /app/data

COPY server.py /app

EXPOSE 10000

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

谢谢!

你有读取键盘中断后的控制台信息吗?它是否打印了服务器监听消息? - penguin2048
我有。它确实显示了正在监听的消息... - T. Merk
@T.Merk,你只在本地主机上进行监听,但从容器的角度来看,你的主机是一个“远程”客户端。将“localhost”更改为“0.0.0.0”,并告诉我们是否解决了任何问题。 - scnerd
不幸的是,将其更改为“0.0.0.0”并没有改变任何东西。仍然显示:^C [+] 服务器正在侦听...回溯(最近的调用最先): - T. Merk
1个回答

3
由于在键盘中断后服务器监听消息仍然可见,这意味着代码正常工作,但输出被缓冲。它们会在程序退出时显示。
使用-u标志运行代码应该有助于解决此问题。根据Python帮助页面:

-u : 无缓冲的二进制stdout和stderr;

这似乎是个问题。因此,在您的Docker文件中,将入口点替换为CMD ["python", "-u", "server.py"] 现在,虽然这将打印输出而不缓冲,但您应该小心地暴露正确的端口并将它们映射到本地系统上的端口,以实际发送/接收服务器响应。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接