файл не найден ошибка при попытке вместить приложение flask — файл не найден ошибка python app.py возвращен ненулевой код 1

#python #docker #flask #dockerfile

Вопрос:

Я работал над этим некоторое время и мог бы воспользоваться некоторой помощью, у меня есть приложение flask, которое отлично работает локально. Я перехожу в каталог приложений из командной строки (пока виртуальная среда активирована) и набираю следующую команду

 python app.py
 

и это работает.. итак, перейдем к его докеризации, чтобы его было легче перенести на мой ноутбук
. Изначально у меня был файл Dockerfile в каталоге приложений, и он выдал ошибку

 sudo docker build -f Dockerfile -t proj:app .
 
 unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/robert/app_folder/app/Dockerfile: no such file or directory
 

несмотря на то, что я был в каталоге приложений при его запуске
, я изменил структуру следующим образом (переместил файл Dockerfile из каталога приложений в каталог папок приложений).

 path/
├──app_folder/
    └── app/
    |    ├── static/
    |    └── css/app.css
    |    └── js/app.js
    |    └── data/
    |    |   └── mod.pickle
    |    |   └── cols.json
    |    └── templates/
    |    |   └── app.html
    |    |   └── subapp.html
    |    |   └── subapp1.html
    |    |   └── subapp2.html
    |    |   └── subapp3.html
    |    └── app.py
    |    └──util.py
    |    └──requirements/
    |    |   └── prod.txt
    |    └── Dockerfile
    |    └── Makefile
    |    └── docker-compose.yml
    └──  my virtual environment goes here?

 

после 3 учебных пособий по докерам и 2 дней работы с примерами, которые я попробовал в своем более простом приложении, вот файл dockerfile

 # syntax=docker/dockerfile:1
FROM python:3.8-slim as production 
ENV PYTHONUNBUFFERED=1
WORKDIR /app
RUN apt-get update -y amp;amp; 
apt-get install -y python-pip python-dev
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0

COPY requirements/prod.txt ./requirements/prod.txt
RUN pip install -r ./requirements/prod.txt 
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
 

the docker-compose file looks like so

 version: "3.8"
services:
  web:
    image: flask-website:latest
    build: .
    ports:
      - "5000:5000"
 

then the Makefile looks like this

 build:
    docker build --force-rm $(options) -t flask-website:latest .

compose-start:
    docker-compose up --remove-orphans $(options)

compose-stop:
    docker-compose down --remove-orphans $(options)

compose-manage-py:
    docker-compose run --rm $(options) website python app.py $(cmd)
 

now when I run the command
sudo docker-compose up
it loads the image, and the site starts up, but it is still not recognizing the pickle file and it comes back with this error when trying to make a post request

 web_1  |   File "/app/util.py", line 75, in predict_price
web_1  |     prediction = inv_boxcox(__model.predict(data)[0], lam)
web_1  | AttributeError: 'NoneType' object has no attribute 'predict'
web_1  | 172.21.0.1 - - [08/Jun/2021 20:31:37] "POST /predict_home_price HTTP/1.1" 500 
 

is there something else I need in the dockerfile as far as the data folder? I thought the Copy . . would take care of everything, I added a line to the Dockerfile

 COPY app/data  ./app/data
 

but it still threw the same error

update — I literally pulled the pickle and json file out, and loaded them directly in util.py and called a live model… it worked again from running python app.py

but still, same docker error

 web_1  | [2021-06-09 05:11:54,251] ERROR in app: Exception on /predict_home_price [POST]
web_1  | Traceback (most recent call last):
web_1  |   File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 2070, in wsgi_app
web_1  |     response = self.full_dispatch_request()
web_1  |   File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1515, in full_dispatch_request
web_1  |     rv = self.handle_user_exception(e)
web_1  |   File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1513, in full_dispatch_request
web_1  |     rv = self.dispatch_request()
web_1  |   File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1499, in dispatch_request
web_1  |     return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
web_1  |   File "/app/app.py", line 35, in predict_home_price
web_1  |     "estimated_price": util.predict_price(
web_1  |   File "/app/util.py", line 75, in predict_price
web_1  |     prediction = inv_boxcox(__model.predict(data)[0], lam)
web_1  | AttributeError: 'NoneType' object has no attribute 'predict'
web_1  | 172.21.0.1 - - [09/Jun/2021 05:11:54] "POST /predict_home_price HTTP/1.1" 500 -
^CGracefully stopping... (press Ctrl C again to force)
Stopping app_web_1 ... done