如何" dockerize"烧瓶应用?

时间:2017-08-10 00:16:32

标签: python-2.7 docker flask dockerfile

我有名为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 我做错了什么?

2 个答案:

答案 0 :(得分:0)

我相信你需要强化你对 Docker 的概念,以便了解它是如何工作的,然后你将实现你的目标" dockerizing"无论什么应用。

这是一个article,它可以为您提供一些初步步骤。

官方HOWTO也会帮助您。

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

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

还有一件事:

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

这就是你想要的原型吗?

请参阅此doc,了解 JSON 标准。

答案 1 :(得分:0)

  1. 您获得的输出是容器ID。检查docker ps是否继续运行。

  2. 使用docker logs [container-id]来弄清楚里面发生了什么。

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

    1. app.run行更改为app.run(host='0.0.0.0', debug=True)。从容器的角度来看,其服务需要外部可用。所以他们需要在loopback接口上运行,就像你在主机上直接设置公共服务器一样运行它。

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

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

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

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