【问题标题】:Dockerize Flask: Error: While importing 'app', an ImportError was raisedDockerize Flask:错误:导入“应用程序”时,引发了 ImportError
【发布时间】:2021-12-17 06:28:24
【问题描述】:

我正在尝试 dockerize 我的 Flask API。一旦我尝试启动我的图像,我就会收到消息:

* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
Usage: python -m flask run [OPTIONS]
Try 'python -m flask run --help' for help.

Error: While importing 'app', an ImportError was raised.

如果我使用终端 python -m flask run 启动 Flask 应用程序,一切都会按预期运行。 现在我被这个问题困住了。

这是我的代码:

from flask import Flask
from bson import json_util
from flask_pymongo import PyMongo
from flask_cors import CORS
import json

app = Flask(__name__)
app.config["MONGO_URI"] = "mongodb://194.163.147.192:27017/test"
CORS(app)
mongo = PyMongo(app)


def parse_json(data):
    return json.loads(json_util.dumps(data))


@app.route('/')
def home():
    return 'Hello'


@app.route('/residential', methods=['GET'])
def find_residential():  # put application's code here
    test = mongo.db.acs.find_one({"name": "Residential"})
    response = Flask.jsonify(parse_json(test))
    response.headers.add('Access-Control-Allow-Origin', '*')
    return response


@app.route('/commercial', methods=['GET'])
def find_commercial():  # put application's code here
    test = mongo.db.acs.find_one({"name": "Commercial"})
    response = Flask.jsonify(parse_json(test))
    response.headers.add('Access-Control-Allow-Origin', '*')
    return response


@app.route('/healthcare', methods=['GET'])
def find_health_care():  # put application's code here
    test = mongo.db.acs.find_one({"name": "Health Care"})
    response = Flask.jsonify(parse_json(test))
    response.headers.add('Access-Control-Allow-Origin', '*')
    return response


@app.route('/germany', methods=['GET'])
def find_germany():
    test = mongo.db.germanies.find_one()
    response = Flask.jsonify(parse_json(test))
    response.headers.add('Access-Control-Allow-Origin', '*')
    return response


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

我的 requirements.txt 看起来像这样

bson==0.5.10
click==8.0.3
colorama==0.4.4
Flask==2.0.2
Flask-Cors==3.0.10
Flask-PyMongo==2.3.0
itsdangerous==2.0.1
Jinja2==3.0.2
MarkupSafe==2.0.1
pymongo==3.12.1
python-dateutil==2.8.2
six==1.16.0
Werkzeug==2.0.2

我的 Dockerfile 看起来像这样

FROM python:3.8-slim-buster
WORKDIR /api
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY . .
CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]

感谢您的帮助:)

项目结构如下:

API
L venv
L app.py
L Dockerfile
L requirements.txt

【问题讨论】:

  • 你的项目目录的结构是什么?目前尚不清楚您的“编码”文件在哪里,它被称为什么或是否有其他任何可能干扰此过程的东西。如果没有更多细节,我无法真正忠实地重现这一点。
  • 编辑:添加文件夹结构
  • 你解决了吗?

标签: python docker flask


【解决方案1】:

不确定它是否会有所帮助......但我也遇到了同样的问题,我刚刚修复了它,更改了我的 entrypoint.sh 文件。

在我开始使用烧瓶应用程序之前:

flask run --host 0.0.0.0 --port 5000

现在我正在使用 gunicorn:

gunicorn -b 0.0.0.0:5000 app:app

所以我也必须在requirements.txt 文件中添加gunicorn

【讨论】:

    【解决方案2】:

    我认为您的问题在于您的需求文件。因为您将 bson 作为依赖项包含在内,它也包含在 pymongo 库中。见this question。删除它似乎可以解决问题:

     ~/tmp/so_q $ docker build -t myimage .                                                             8s nathanielford@nford 20:51:04
    Sending build context to Docker daemon   5.12kB
    
    ...
    
    Successfully tagged myimage:latest
     ~/tmp/so_q $ docker run myimage                                                                   13s nathanielford@nford 20:51:26
     * Environment: production
       WARNING: This is a development server. Do not use it in a production deployment.
       Use a production WSGI server instead.
     * Debug mode: off
     * Running on all addresses.
       WARNING: This is a development server. Do not use it in a production deployment.
     * Running on http://192.168.9.2:5000/ (Press CTRL+C to quit)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-24
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多