首页 > 解决方案 > Dockerize Flask:错误:导入“应用程序”时,引发了 ImportError

问题描述

我正在尝试对接我的 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.

如果我用我的终端启动 Flask 应用程序,python -m flask run 一切都会按预期工作。现在我被困在这个问题上。

这是我的代码:

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

标签: pythondockerflask

解决方案


我认为您的问题在于您的需求文件。在那里,您将bson其作为依赖项包含在内,该依赖项也包含在pymongo库中。看到这个问题。删除它似乎可以解决问题:

 ~/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)

推荐阅读