【问题标题】:How to "dockerize" Flask application?如何“dockerize” Flask 应用程序?
【发布时间】:2017-08-10 00:16:31
【问题描述】:

我有名为 rest.py 的 Flask 应用程序,我有 dockerize 但它没有运行。

#!flask/bin/python
from flask import Flask, jsonify

app = Flask(__name__)
tasks = [
          {
            'id': 1,
            'title': u'Buy groceries',
            'description': u'Milk, Cheese, Pizza, Fruit, Tylenol', 
            'done': False
          }
        ]

@app.route('/tasks', methods=['GET'])
def get_tasks():
    return jsonify({'tasks': tasks})

if __name__ == '__main__':
    app.run(debug=True)

Dockerfile如下

FROM ubuntu 
RUN apt-get update -y
RUN apt-get install -y python-dev python-pip
COPY . /rest
WORKDIR /rest
RUN pip install -r Req.txt 
ENTRYPOINT ["python"]
CMD ["rest.py"]

我已经使用这个命令构建了它...

$ docker build -t flask-sample-one:latest

...当我运行容器时...

$ docker run -d -p 5000:5000 flask-sample-one 

返回以下输出: 7d1ccd4a44712​​84127a5f4579427dd106df499e15b868f39fa0ebce8​​4c494a42 我做错了什么?

【问题讨论】:

  • -d 是分离的(它在后台运行——你打算测试它吗?)

标签: python-2.7 docker flask dockerfile


【解决方案1】:
  1. 您得到的输出是容器 ID。检查docker ps 是否继续运行。

  2. 使用docker logs [container-id] 找出里面发生了什么。

  3. 我可以在你的问题中找到一些问题:

    1. app.run 行更改为app.run(host='0.0.0.0', debug=True)。从容器的角度来看,它的服务需要在外部可用。因此它们需要在环回接口上运行,就像您直接在主机上设置公开可用的服务器时运行它一样。

    2. 确保已安装 Flask。您的 docker 映像文件需要所有命令才能使其在空白 Ubuntu 安装中运行。

    3. 如果您曾经在主机上公开此服务,请不要忘记停用调试。 Flask 中的调试模式使访问者可以在触发异常时运行任意代码(这是一项功能,而不是错误)。

之后(并再次构建容器 [1]),在主机上尝试 curl http://127.0.0.1:5000/tasks。让我知道它是否有效,如果没有,您的设置中还有其他问题。

[1] 如果您在 docker 容器中为包含 python 文件的目录使用卷挂载,则可以使用 Flask 的内置重新加载器(默认启用)改进原型设计工作流程 - 这将允许您更改你的脚本在主机上,在浏览器中重新加载并直接查看结果。

【讨论】:

  • 我可以直接在 RESTclient 上使用它来获取而不是 curl 吗?
  • 当然,用你喜欢的任何东西来测试它。我认为人们通常喜欢使用curl 作为第一步,因为这是查看路由是否符合您的要求的最快方法。
  • 当我运行容器时,它给出的输出为 13cf014998af516a1e11f4130e226632b996d9355a439a452a22d6c42b7a‌​074b 然后它停止。我添加了 host='0.0.0.0 并将调试模式设置为 False
【解决方案2】:

我认为您需要加强您对 Docker 的概念,以了解它是如何工作的,然后您将实现关于“dockerizing”任何应用程序的目标。

这是一个article,它可以帮助您迈出第一步。

官方HOWTO也会帮助你。

一些可能对您有所帮助的观察:

  • 检查您的 Req.txt 是否包含用于安装的flask
  • dockerizing 之前,检查您的应用程序是否正常运行
  • 使用docker ps 检查您正在运行的容器,看看您的容器是否正在运行
  • 如果它正在运行,请测试您的应用程序:curl http://127.0.0.1:5000/tasks *

还有一件事:

  • 您的 JSON 有一个 OBJECT 和一个 ARRAY,只有一个 ELEMENT

这就是你想要的原型吗?

看看这个doc,关于JSON标准。

【讨论】:

  • 没关系,我刚开始学习docker。你能告诉我我做错了什么吗?
  • 看看我的答案@sky,并阅读两个链接。另外,请注意我的观察。你只需要加强一些概念:)。
  • 我的容器没有运行,它在给出这个输出后停止 - 13cf014998af516a1e11f4130e226632b996d9355a439a452a22d6c42b7a074b
  • 我相信在创建新的 docker 镜像之前,你应该看看你的 Flask 应用程序是否正常工作。你得一点一点地去,消除问题,“分而治之”。
  • @sky 我认为您的 docker 文件中还需要 RUN pip install -y flask。使用docker logs [container-id] 查看容器本身的输出,了解里面发生了什么。
猜你喜欢
  • 2021-01-01
  • 2023-03-12
  • 1970-01-01
  • 2021-12-17
  • 2018-01-10
  • 2019-06-17
  • 1970-01-01
  • 2019-04-29
  • 2016-07-10
相关资源
最近更新 更多