将目录添加到Docker容器以运行Flask应用程序

3

我有一个文件夹结构,看起来像这样:

 +--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

我会把你的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到容器中,但这取决于代码的具体情况。


很不幸,我仍然遇到相同的错误。我尝试了各种变化,但都无法运行该服务。 - JCM
我在生产文件夹中添加了一个空的__init__.py文件,但这并没有解决问题。 - JCM
你需要在__init__.py两侧加上双下划线,虽然我猜你已经知道了这一点... 你可能已经非常接近成功了!你有没有可用的Github仓库呢? - v25
我在init.py上有双下划线...Stack Overflow将其加粗显示。目前我没有公开这个,如果我无法解决问题,我会对其进行匿名处理并发布。谢谢! - JCM
在构建阶段,在失败之前,您会看到一行类似于“Step 7/8”的内容,后面跟着“---> f172e53dc0b7”。那是部分镜像ID。您可以使用“docker exec -it f172e53dc0b7 /bin/sh”进入其中并进行探索。尝试在其中找出哪些不正确。请注意,您将从“/app”开始,这是“WORKDIR”行的结果。从那里,您应该能够运行flask命令来启动。祝你好运。 - v25
显示剩余2条评论

0

我已经让它正常工作了,但我不确定是哪些更改解决了问题。

我保持了结构的相似性,但在“mlservice”下添加了一个名为“app”的层,并在“production”目录中添加了一个init.py文件:

 +--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" ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接