代码之家  ›  专栏  ›  技术社区  ›  JCM

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

  •  0
  • JCM  · 技术社区  · 6 年前

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

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

    哪里 生产 是一个目录和 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'
    

    我尝试了所有不同的方法将目录复制到容器中,但无济于事。我认为我对相对进口没有问题,因为 生产 在命令提示符下运行时成功找到文件夹。我认为问题在于我如何复制 mlservice 目录到容器。有人能看出我在这里做错了什么吗?

    0 回复  |  直到 6 年前
        1
  •  0
  •   v25    6 年前

    我可能会把你的 requirement.txt 进入 production/ 然后directory执行以下操作:

    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 通过将其放入生产目录,可以将其单独放入容器中,但这取决于代码的外观。

        2
  •  0
  •   JCM    6 年前

    我让它工作了,但我不确定我的哪些更改解决了问题。

    我保持了结构非常相似,但在“mlservice”下添加了一个名为“app”的层,并将init.py添加到“product”目录中:

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