Docker Добавить каталог в контейнер для запуска Flask Приложение - PullRequest
0 голосов
/ 08 января 2020

У меня есть структура папок, которая выглядит следующим образом:

 +--mlservice
 |   __init__.py
 |   production
 |   requirements.txt
 |   venv
 |   DockerFile

, где production - это каталог, а init.py - основной скрипт.

Это мой DockerFile.

FROM python:3.7

ENV FLASK_APP "mlservice/__init__.py"

RUN mkdir /app
WORKDIR /app

# Install the dependencies specified in requirements file
COPY requirements.txt /app/
RUN pip install -r requirements.txt

# Copy all directories and files from host to container
COPY . /app
COPY production /app/mlservice/production

EXPOSE 5000

# Run the application; default command to run when container starts
CMD flask run --host=0.0.0.0

Мое приложение работает нормально в моей виртуальной среде при запуске в командной строке, но при попытке запустить его в контейнере Docker я получаю следующую ошибку :

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/flask/cli.py", line 240, in locate_app
    __import__(module_name)
  File "/app/__init__.py", line 18, in <module>
    from production.dataprocessing import DataProcessing
ModuleNotFoundError: No module named 'production'

Я пробовал все разные способы скопировать мой каталог в контейнер, но безрезультатно. Я не думаю, что у меня есть проблема с относительным импортом, потому что папка production успешно обнаружена при запуске в командной строке. Я думаю, что проблема заключается в том, как я копирую каталог mlservice в контейнер. Кто-нибудь может увидеть, что я здесь делаю не так?

Ответы [ 2 ]

0 голосов
/ 09 января 2020

У меня все получилось, но я не уверен, какие из моих изменений устранили проблему.

Я сохранил структуру очень похожей, но добавил слой в "mlservice", называемый "app", и добавил init.py в каталог "production":

 +--mlservice
  |--app
    |--main.py
    |--production
       |--__init__.py
       |--dataprocessing.py
    |--requirements.txt
    |--venv
    |--DockerFile

Я смог упростить Dockerfile:

FROM python:3.7

EXPOSE 5000

WORKDIR /app
ADD . /app

RUN pip install -r requirements.txt

ENTRYPOINT [ "python" ]
CMD [ "app/main.py" ]
0 голосов
/ 08 января 2020

Я бы, вероятно, переместил ваш requirement.txt в каталог production/, а затем сделал бы что-то вроде:

FROM python:3.7

ENV FLASK_APP "/app/__init__.py"

COPY ./production /app/production
COPY ./__init__.py /app/__init__.py

WORKDIR /app

# Install the dependencies specified in requirements file
RUN pip install -r production/requirements.txt

EXPOSE 5000

# Run the application; default command to run when container starts
CMD flask run --host=0.0.0.0

Это имеет дополнительное преимущество:

  • Не копировать папка venv в образе
  • Не копирует Dockerfile в образ.

Возможно, вы могли бы покончить с четвертой строкой, которая сама копирует __init__.py в контейнер , также поместив это в рабочий каталог, но это будет зависеть от того, как выглядит код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...