嗨,并且事先感谢,我是码头工的新手,我被困在一个简单的码头工具示例中,在容器外露出烧瓶服务。
我有一个名为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的响应。
答案 0 :(得分:2)
如果查看documentation,您会发现:
外部可见服务器
如果您运行服务器,您会注意到 服务器只能从您自己的计算机访问,而不能从任何计算机访问 其他在网络中。这是默认值,因为在调试模式下a 应用程序的用户可以在您的上执行任意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
答案 1 :(得分:1)
一个更好的选择是禁用调试器,并强制flask应用程序直接从您的代码监听所有接口,而无需修改Dockerfile。
这是一个不错的工作片段:
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')