【问题标题】:What PYTHONPATH should I setup in Dockerfile?我应该在 Dockerfile 中设置什么 PYTHONPATH?
【发布时间】:2019-09-09 00:56:31
【问题描述】:

这真的让我很烦。

这是包含 Dockerfile 的文件夹的层次结构。

server
    - __init__.py
    - nlp
        - core.py
    - Dockerfile
    - server.py

这是我的 Dockerfile。

FROM continuumio/miniconda3

COPY . /usr/src/app
WORKDIR /usr/src/app
RUN conda env create -f environment.yml

# Pull the environment name out of the environment.yml
RUN echo "source activate $(head -1 environment.yml | cut -d' ' -f2)" > ~/.bashrc
ENV PATH /opt/conda/envs/$(head -1 environment.yml | cut -d' ' -f2)/bin:$PATH

RUN /bin/bash -c "source ~/.bashrc" && /opt/conda/envs/rdqcc_nlp/bin/python -m spacy download en_core_web_sm

ENV PATH "/opt/conda/envs/rdqcc_nlp/bin/python:${PATH}"
ENV PYTHONPATH "${PYTHONPATH}:/usr/src/app:/usr/src/app/nlp"

CMD ["/opt/conda/envs/rdqcc_nlp/bin/python", "server.py"]

这是我在server.py 中导入 nlp 模块的方法。

from .nlp.core import NLP

我也试过

from server.nlp.core import NLP

但同样的错误弹出 ModuleNotFoundError: No module named '__main__.nlp'; '__main__' is not a package 或者 ModuleNotFoundError: No module named 'server.nlp'; '__main__' is not a package

我是否设置了错误的PYTHONPATH?我应该怎么办?顺便说一句,我使用docker-compose 调用从server 文件夹构建的服务。

【问题讨论】:

  • 您可以通过echo envvars 和sys.pathls 目录结构来诊断这个...
  • @ivan_pozdeev 感谢您的建议。你知道PYTHONPATH 到底是做什么的吗?由于我在 Pycharm 中一切正常,我想知道如何填补 docker 和 PyCharm 之间的空白。

标签: python docker pythonpath


【解决方案1】:

您将 Dockerfile 置于错误的级别。当文件被复制进来时,你会得到:

  • /usr/src/app/__init__.py
  • /usr/src/app/nlp/
  • ...

等等

所以:

如果您使用的是 Linux/Mac,请移动 Dockerfile,使其与 server/ (cd server; mv Dockerfile ..) 处于同一级别:

  • Dockerfile
  • server/__init__.py
  • server/nlp/
  • ...

然后你可以在你的代码中做from server import whatever,它会从服务器包中导入。例如。 from server import server 将导入 server.py。

【讨论】:

    猜你喜欢
    • 2011-12-12
    • 2019-06-15
    • 2020-11-05
    • 2021-05-23
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 2014-07-10
    相关资源
    最近更新 更多