首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker运行python脚本找不到本地安装的模块

Docker运行python脚本找不到本地安装的模块
EN

Stack Overflow用户
提问于 2020-03-10 18:01:53
回答 1查看 185关注 0票数 1

对于上下文,此问题与将使用蔚蓝批处理运行的码头映像有关。

以下是完整的Dockerfile

代码语言:javascript
复制
FROM continuumio/miniconda3

ADD . /pipegen

ADD environment.yml /tmp/environment.yml
RUN conda env create -f /tmp/environment.yml

RUN echo "conda activate $(head -1 /tmp/environment.yml | cut -d' ' -f2)" >> ~/.bashrc

ENV PATH /opt/conda/envs/$(head -1 /tmp/environment.yml | cut -d' ' -f2)/bin:$PATH
ENV CONDA_DEFAULT_ENV $(head -1 /tmp/environment.yml | cut -d' ' -f2)

ADD classify.py /classify.py
RUN rm -rf /pipegen

pipgen是使用Dockerfile文件安装的本地模块(Dockerfile所在的地方)。以下是完整的environment.yml文件:

代码语言:javascript
复制
name: pointcloudz

channels:
  - conda-forge
  - defaults

dependencies:
  - python=3.7
  - python-pdal
  - entwine
  - matplotlib
  - geopandas
  - notebook
  - azure-storage-blob==1.4.0
  - pip:
    - /pipegen
    - azure-batch==6.0.0

为了清晰起见,目录结构如下所示:

代码语言:javascript
复制
Dockerfile
pipegen
  \__ __init__.py
  \__ pipegen.py
  \__ utils.py
classify.py
batch_containers.py
environment.yml
setup.py

Dockerfile建立了在容器运行时使用environment.yml文件作为默认(conda) python环境创建的环境。因此,我可以交互地运行容器如下:

docker run -it pdalcontainers.azurecr.io/pdalcontainers/pdal-pipelines

并且,在容器内部,使用一些命令行参数执行classify.py脚本,如下所示:

python classify.py in.las out.las --defaults

并且脚本将按预期执行。但是,当我运行以下命令试图从容器“外部”执行相同的脚本时,

docker run -it pdalcontainers.azurecr.io/pdalcontainers/pdal-pipelines python classify.py in.las out.las --defualts

我得到以下错误:

代码语言:javascript
复制
File "classify.py", line 2, in <module>
    from pipegen.pipegen import build_pipeline, write_las
ModuleNotFoundError: No module named 'pipegen'

首先,classify.py脚本导入pipegen,这个本地模块现在安装在在Dockerfile中创建的conda环境中。由于Azure批处理作业的运行方式受到限制,我需要能够使用上面的docker run命令执行脚本。我尝试过多个修复方法,但现在我已经被困住了。任何智慧都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-10 18:48:16

您面临的问题是,您将conda activate添加到.bashrc脚本中,该脚本仅为登录shell激活。当您以交互方式运行容器时,这就是您要得到的。但是,当您尝试直接调用python脚本时,您不会获得登录shell,因此您的conda环境是而不是激活的。

有人认为您可以不使用conda,而是使用conda run运行脚本。为了简化命令行,将这个入口点添加到您的Dockerfile中:

ENTRYPOINT ["conda", "run", "-n", "$CONDA_DEFAULT_ENV", "python", "classify.py"]

在入口点中使用这一点还允许调用者通过docker运行传递命令行参数。

来自Dockerfile引用

将在exec窗体入口点中的所有元素之后追加用于docker run的命令行参数。

有关更详细的解释,请参见激活Dockerfile中的Conda环境

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60623444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档