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

2024-09-27 00:19:26 发布

您现在位置:Python中文网/ 问答频道 /正文

对于上下文,此问题与将使用azure批处理运行的docker映像有关

以下是Dockerfile,全文如下:

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是使用environment.yml文件安装的本地模块Dockerfile。以下是完整的environment.yml文件:

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

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

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

我得到以下错误:

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命令执行脚本。我已经尝试了多次修复,但现在已经相当卡住了。任何智慧都将不胜感激


Tags: dockerpydockerfile脚本addenvironmentymlazure
1条回答
网友
1楼 · 发布于 2024-09-27 00:19:26

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

您可以不使用conda activate,而是使用conda run运行脚本。要简化命令行,请将此入口点添加到Dockerfile:

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

在入口点中使用它还允许调用方通过docker run传递命令行参数

Dockerfile reference

Command line arguments to docker run will be appended after all elements in an exec form ENTRYPOINT

有关更详细的解释,请参见Activating a Conda environment in your Dockerfile

相关问题 更多 >

    热门问题