【问题标题】:Simple flask service do not respond outside a docker container简单的烧瓶服务在 docker 容器外不响应
【发布时间】:2018-06-06 19:32:17
【问题描述】:

您好,在此先感谢您,我是 docker 新手,我被困在一个简单的 docker 示例上,该示例将烧瓶服务暴露在容器外。

我有一个名为 rest_example 的文件夹,位于一个 dockerfile 和一个 .py 文件中。 这是我的 dockerfile:

FROM ubuntu:16.04
LABEL maintainer="Lorem Ipsum"
RUN apt-get update  &&  \
    apt-get install -y python  && \
    apt-get install -y python-pip  && \
    pip install Flask  && \
    apt-get install -y curl  && \
    mkdir files
COPY flask_example.py /files
ENV FLASK_APP /files/flask_example.py
EXPOSE 5000
CMD flask run

这是flask_example.py:

from flask import Flask

app = Flask(__name__)

@app.route("/hello")
def hello():
    return "Hello World!"

我正在创建这样的图像: docker run rest_example -t -p 5000:5000 --name=rest_example --rm

当我在容器内点击curl localhost:5000/hello 时,响应如下: Hello World!,表示烧瓶在容器内,但是在我的本地浏览器中没有对该 url 的响应。

【问题讨论】:

    标签: docker flask


    【解决方案1】:

    如果您查看documentation,您会发现:

    外部可见服务器

    如果你运行服务器,你会注意到 服务器只能从您自己的计算机访问,而不是从任何 网络中的其他。这是默认设置,因为在调试模式下 该应用程序的用户可以在您的应用程序上执行任意 Python 代码 电脑。

    如果您禁用了调试器或信任网络上的用户, 您只需添加即可使服务器公开可用 --host=0.0.0.0 到命令行:

    烧瓶运行 --host=0.0.0.0

    这告诉您的操作系统监听 所有公共 IP。

    您在启动容器时确实发布了端口 5000,但没有指示 Flask 实际侦听“外部”接口。

    您确实启动了容器以将容器的“外部”链接到本地​​计算机,但那里没有任何监听。

    像这样尝试你的 dockerfile,添加上面显示的文档中提到的参数:

    FROM ubuntu:16.04
    LABEL maintainer="Lorem Ipsum"
    RUN apt-get update  &&  \
        apt-get install -y python  && \
        apt-get install -y python-pip  && \
        pip install Flask  && \
        apt-get install -y curl  && \
        mkdir files
    COPY flask_example.py /files
    ENV FLASK_APP /files/flask_example.py
    EXPOSE 5000
    CMD flask run --host=0.0.0.0
    

    【讨论】:

    • 非常感谢,bgse,这项工作我明白了。
    【解决方案2】:

    更好的选择是禁用调试器并强制烧瓶应用直接从您的代码侦听所有接口,而无需修改 Dockerfile。

    这是一个很好的工作 sn-p:

    from flask import Flask
    
    # init the app
    app = Flask(__name__)
    
    # sample route
    @app.route('/hello')
    def hello():
        return 'Hello World!'
    
    
    if __name == '__main__':
    
        # running the server
        app.run(debug=False, host='0.0.0.0')
    

    【讨论】:

      猜你喜欢
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-19
      • 2019-01-25
      • 2020-11-03
      • 1970-01-01
      • 2020-01-13
      相关资源
      最近更新 更多