我的文件夹结构如下所示:
+--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 目录复制到容器中。谁能看出我在这里做错了什么?
最佳答案
我可能会将您的 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
本身复制到容器中的第四行,方法是将其也放入生产目录中,但这取决于代码的外观。
关于python - Docker 将目录添加到容器以运行 Flask 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59636985/