首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在Docker中运行BaseHTTPServer

无法在Docker中运行BaseHTTPServer
EN

Stack Overflow用户
提问于 2018-04-29 22:26:46
回答 2查看 1K关注 0票数 1

我有以下python代码,其中我通过扩展HTTPBaseServer编写了一个简单的HTTP服务器:

代码语言:javascript
复制
class ApiError(Exception):
    def __init__(self, code, msg=None, desc=None):
        self.code = code
        self.msg = msg
        self.desc = desc

    def __str__(self):
        return f"ApiError({self.code}, {self.msg})"


def ApiRoute(path):
    def outer(func):
        if not hasattr(func, "_routes"):
            setattr(func, "_routes", [])
        func._routes += [path]
        return func
    return outer


class ApiServer(HTTPServer):
    def __init__(self, addr, port):
        server_address = (addr, port)
        self.__addr = addr

        class handler_class(ApiHandler):
            pass

        self.handler_class = handler_class

        # routed methods map into handler
        for meth in type(self).__dict__.values():
            if hasattr(meth, "_routes"):
                for route in meth._routes:
                    self.add_route(route, meth)

        super().__init__(server_address, handler_class)

    def add_route(self, path, meth):
        self.handler_class._routes[path] = meth

    def port(self):
        "Get my port"
        sa = self.socket.getsockname()
        return sa[1]

    def address(self):
        "Get my ip address"
        sa = self.socket.getsockname()
        return sa[0]

    def uri(self, path):
        "Make a URI pointing at myself"
        if path[0] == "/":
            path = path[1:]
        return "http://"+self.__addr + ":"+ str(self.port()) + "/" + path

    def shutdown(self):
        super().shutdown()
        self.socket.close()


class ApiHandler(BaseHTTPRequestHandler):
    _routes={}

    def do_GET(self):
        self.do_XXX()

    def do_XXX(self, info={}):
        url=urlparse.urlparse(self.path)

        handler = self._routes.get(url.path)

        if handler:
            response=handler(info)
            self.send_response(200)
            response = json.dumps(response)
            response = bytes(str(response),"utf-8")
            self.send_header("Content-Length", len(response))
            self.end_headers()
            self.wfile.write(response)


class MyServer(ApiServer):
    @ApiRoute("/popup")
    def popup(req):
        return "HERE"


httpd = MyServer('127.0.0.1', 5000)
print("serving on ", httpd.address(), httpd.port())
threading.Thread(target=httpd.serve_forever).start()

当我这么做的时候,上面的一切都很完美,

python serv.py

在终点站。

但是,我想在一个码头容器中运行这个程序。Dockerfile如下所示:

代码语言:javascript
复制
FROM python:3.6-alpine3.7

COPY . /serv

WORKDIR /serv

ENTRYPOINT ["python"]
CMD ["serv.py"]

然后使用以下方法构建Docker映像:

码头修造。-t自定义服务器

并将其作为容器运行,使用:

docker run -rm -p 5000:5000自定义服务器

我确实得到了指示服务器成功启动的日志消息,但是url上的curl返回以下内容:

curl:(56) Recv失败:由对等方重置连接

我意识到,有很多框架可以让生活变得更简单,但是这更像是我在做的一个实验,如果有人能给我指明正确的方向,那就太棒了!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-29 22:37:56

更改这一行:

代码语言:javascript
复制
httpd = MyServer('127.0.0.1', 5000)

至:

代码语言:javascript
复制
httpd = MyServer('0.0.0.0', 5000)

关于差异:https://www.howtogeek.com/225487/what-is-the-difference-between-127.0.0.1-and-0.0.0.0/

票数 3
EN

Stack Overflow用户

发布于 2018-04-29 22:46:12

您的服务器在本地主机上监听,不响应任何其他连接,而是从本地主机响应。如果您要从容器中的连接到您的服务器,它就可以工作了。但是要从外部连接,您需要指定服务器侦听来自所有可用位置的所有连接。

因此,您需要更改

代码语言:javascript
复制
httpd = MyServer('127.0.0.1', 5000)

代码语言:javascript
复制
httpd = MyServer('0.0.0.0', 5000)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50091895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档