簡體   English   中英

Docker 運行錯誤 - 無法在模塊“app”中找到 Flask 應用程序或工廠。 使用 "FLASK_APP=app:name 指定一個

[英]Docker run error - Failed to find Flask application or factory in module "app". Use "FLASK_APP=app:name to specify one

嘗試 dockerize 這個燒瓶應用程序......運行以下

docker build --tag flask-website .

工作,輸出成功構建,成功標記。

編輯:下一個命令有效

$ docker run --publish 5000:5000 flask-website
 * 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

好的,那么我運行curl localhost:5000

這給出了這個錯誤

curl: (7) Failed to connect to localhost port 5000: Connection refused

好吧,直截了當,所以我試試這個

docker-compose up

結果

Creating network "app_default" with the default driver
Creating app_web_1 ... done
Attaching to app_web_1
web_1  |  * Environment: production
web_1  |    WARNING: This is a development server. Do not use it in a production deployment.
web_1  |    Use a production WSGI server instead.
web_1  |  * Debug mode: off

但是嘗試導航到 localhost:5000 我得到

This site can’t be reachedThe webpage at http://localhost:5000/ 
might be temporarily down or it may have moved permanently 
to a new web address.
ERR_SOCKET_NOT_CONNECTED

目錄結構看起來像這樣

├──app_folder/
    └── app/
    |    ├── static/
    |    |      └── css/
    |    |          └──app.css
    |    |      └── js/
    |    |          └──app.js
    |    └── templates/
    |    |   └── app.html
    |    |   └── subapp.html
    |    |   └── subapp1.html
    |    |   └── subapp2.html
    |    |   └── subapp3.html
    |    └── app.py
    |    └── util.py
    |    └── pickle_file.pickle
    |    └── requirements.txt
    |    └── Dockerfile
    |    └── Makefile
    |    └── docker-compose.yml

dockerfile 看起來像這樣

FROM python:3.8

ENV PYTHONUNBUFFERED=1

WORKDIR /

COPY requirements.txt requirements.txt
COPY . .

RUN pip install -r requirements.txt

# EXPOSE 5000

CMD [ "python", "-m" , "flask", "run", "--host=0.0.0.0"]

我曾嘗試使用 EXPOSE 5000 取消注釋和評論,沒有任何區別

我還更新了目錄結構和 dockerfile,這消除了我看到的命令行錯誤

docker-compose 看起來像這樣

version: "3.7"
services:
  web:
    image: flask-website:latest
    ports:
      - 5000:5000

我嘗試在應用程序目錄之外使用 dockerfile、docker-compose、makefile 和需求,並在 WORKDIR 行上使用稍微修改的 dockerfile,這導致了此錯誤

Error: Failed to find Flask application or factory in module "app". Use "FLASK_APP=app:name to specify one.

不知道還有什么可以嘗試的? 我可以使用python -m flask run在本地運行它,但我似乎無法對其進行 dockerize,這似乎不應該這么困難?

為了完整起見,app.py 看起來像這樣


from flask import Flask, request, jsonify
from flask import render_template, redirect
import json
import util

app = Flask(__name__, template_folder="templates", static_folder="static")


@app.route("/", methods=["GET", "POST"])
def index():
    return render_template("app.html")


@app.route("/predict_home_price", methods=["GET", "POST"])
def make_prediction():
   x = request.form["x"]
   y = float(request.form["y"]
   response = jsonify(
      {
         "prediction": util.prediction(x, y)
      }
   )
   response.headers.add("Access-Control-Allow-Origin", "*")
   
   return response

if __name__ == "__main__":
    from waitress import serve

    serve(app, host="0.0.0.0", port=5000)

util.py 看起來像這樣

import pickle
import pandas as pd
from scipy.special import inv_boxcox

# to run locally uncomment out the following
# with open("/path/to/pickle/app/pickle_mod.pickle", "rb") as f:
# to run in docker use the following
with open("app/pickle_mod.pickle", "rb") as f:
    __model = pickle.load(f)

def prediction(x, y):
   lambs = 0.205
   a = [[x, y]]
   cols = ["x", "y"]
   my_data = pd.DataFrame(data=a, columns=cols)
   pred = inv_boxcox(__model.predict(my_data)[0], lambs)
   return f"${round(pred)}"

if __name__ == "__main__":
   print(prediction(5, 4))

我也嘗試過使用 util 中的 pickle 導入的兩種方法,結果相同 - 我認為因為我是在 docker 容器中構建它,所以第二次導入是正確的

我也為 app.run 嘗試了這個塊,結果相同

if __name__ == "__main__":
    app.run()

我在 docker 中運行了一個簡單的燒瓶應用程序,結果如下。 在您的 docker compose 中,您不需要添加command: python app/app.py因為這一行已添加到 Dockerfile 中。

您在 Docker Compose 中唯一需要的是端口和映像名稱

好的,需要進行以下更改才能構建此映像並運行容器

碼頭檔案:

FROM python:3.8

WORKDIR /

COPY requirements.txt requirements.txt

RUN pip install -r requirements.txt

COPY . .

EXPOSE 5000

ENTRYPOINT ["python", "./app.py"]

然后對主應用程序 app.py 進行以下更改

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0')

然后到 util.py,它有一個錯誤,我直到運行docker run [TAG]才看到

with open("pickle_mod.pickle", "rb") as f:
    __model = pickle.load(f)

然后運行docker build -t [TAG] . 然后運行docker-compose up

然后導航到 localhost 監聽端口 5000 並且有正在運行的容器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM