我有一个flask应用程序,可以根据用户调用运行一些操作。在此应用程序中,我还有一个基本端点,该端点仅返回一个字符串,可以帮助我查看该应用程序是否正在运行。
@app.route("/hello")
def hello():
return "Hello World!"
现在,我尝试使用来自官方docker站点的this教程对这个应用程序进行docker化。 flask应用程序监听端口5000,因此我在Dockerfile中添加了一个条目以暴露端口5000。
EXPOSE 5000
我在Dockerfile中运行该应用程序的命令是
CMD ["python","model.py"]
model.py文件包含根据用户输入调用其他功能的flask代码。
现在,在将应用容器化后运行我的应用程序时,我在终端上看到烧瓶应用程序确实正在运行的所需输出。这是我用来运行应用程序的命令。
docker run -p 5000:5000 firstContainer
当我尝试通过使用请求http://localhost:5000/hello来调用上述基本helloWorld方法时,收到一条错误消息,指出该站点不可用。我在这里的端口映射是否做错了什么?如何解决此问题?
编辑:添加更多详细信息
因此,我尝试进入容器中查看正在发生的事情,并且能够查看容器上可用的文件,它们看起来不错。当我尝试使用基本命令在容器中再次启动应用程序
python model.py
它返回一个错误,指出该端口已在使用中。因此,这意味着该应用确实在端口上进行监听。我还在容器中安装了curl以浏览URL,当我在容器中运行它时它返回了预期的字符串。我只是不明白如何将它暴露给外界
编辑2:
容器日志
* Serving Flask app "model" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: on
答案 0 :(得分:0)
尝试:
docker run --rm -it --network=host -p 5000:5000 firstContainer
该问题可能与联网有关。因此--network = host将容器连接到基础主机。
答案 1 :(得分:0)
问题是服务器默认仅回答内部请求。您有两种选择。
您可以通过编程方式将主机设置为:
0.0.0.0
使用CMD:
flask run --host=0.0.0.0`
提示:现成的ngnix
后还有一个container运行中的烧瓶。
答案 2 :(得分:0)
我在Docker容器中的Flask应用程序上遇到了同样的问题。我使用了-network = host 并解决了该问题。
# docker run -it -p 8080:8080 --network=host mbilgen/metacriticv3:1.0
WARNING: Published ports are discarded when using host network mode
* Serving Flask app "main" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://127.0.0.1:8080/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 258-420-336
127.0.0.1 - - [12/May/2019 03:55:08] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/May/2019 03:55:13] "GET /games HTTP/1.1" 200 -
INFO:werkzeug:127.0.0.1 - - [12/May/2019 03:55:13] "GET /games HTTP/1.1" 200 -