Estoy tratando de dockerizar mi Flask API. Tan pronto como trato de iniciar mi imagen, recibo el mensaje:
* 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. Si estoy iniciando la aplicación Flask con mi terminal python -m flask run todo funciona según lo previsto. Y ahora mismo estoy atascado en este problema.
Aquí está mi código:
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()Mis requisitos.txt se ve así
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.2Mi Dockerfile se ve así
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"]Estoy agradecido por cualquier ayuda :)
La estructura del proyecto es como:
API L venv L app.py L Dockerfile L requirements.txtSu problema es, creo, con su archivo de requisitos. En eso incluye bson como una dependencia, que también se incluye en la biblioteca pymongo . Ver esta pregunta . Quitarlo parece resolver el problema:
~/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)No estoy seguro de si ayudará ... pero también tuve el mismo problema y lo acabo de arreglar cambiando mi archivo entrypoint.sh .
Antes de comenzar la aplicación del matraz usando:
flask run --host 0.0.0.0 --port 5000Y ahora estoy usando gunicorn:
gunicorn -b 0.0.0.0:5000 app:app Así que también tuve que agregar gunicorn en el archivo requirements.txt .