运行在docker中导入本地脚本的python脚本

时间:2017-08-24 17:52:58

标签: python docker dockerfile

我有一个本地脚本main.py,用于导入另一个本地脚本submain.py。当我在docker中运行它时,我收到以下错误:

qsub -cwd -soft -l docker,docker_images="*docker_imagename*" -S /usr/bin/python ./main.py --arg1 value1 --arg2 value2

from submain import func
ImportError: No module named submain

我的Dockerfile如下所示:

FROM ubuntu:latest
RUN apt-get -y update && apt-get -y install build-essential libxml2-dev zlib1g-dev python-dev python-pip pkg-config libffi-dev libcairo-dev
RUN pip install --upgrade pip
RUN pip install python-igraph scikit-learn numpy scipy matplotlib

CMD /usr/local/bin/igraph

如何运行我的脚本main.py并在本地存储其他脚本?如果这不可能,我如何“附加”submain.py到docker镜像?

2 个答案:

答案 0 :(得分:1)

以下是使用docker + python(忽略qsub)的最佳示例。

首先,main.py:

from submain import my_fn

if __name__ == '__main__':
    print('got val {} from submain.my_fn'.format(my_fn(12)))

和submain.py:

def my_fn(val):
    return val * 2

Dockerfile [1]:

FROM python:3

COPY main.py main.py
COPY submain.py submain.py

ENTRYPOINT python main.py

然后测试它:

$ docker build -t main-py-img .
# ... lots of output ...
Successfully built e79194e43094
Successfully tagged main-py-img:latest
$ docker run main-py-img

如果可能的话,在转向使用qsub提交作业之前,您应该尝试在本地环境中对此进行测试,以解决python + docker问题。使用qsub提交运行您的docker镜像的作业是一个不同的问题 - 一旦您解决了这个部分,可能应该创建一个关于该问题的新问题。

[1]为简单起见,我继承了python:3 docker镜像,以避免必须安装所有python依赖项。如果由于某种原因你需要Ubuntu,你可以尝试使用它。如果您不需要Ubuntu,只需将RUN pip install igraph添加到上面的Dockerfile(如果您需要python 2而不是python 3,则从python:2继承),但我建议从最开始最小的例子可能,并从那里建立。

答案 1 :(得分:0)

回答

  

如何运行我的脚本main.py并在本地存储其他脚本?

Python将尝试使用其库路径和当前目录加载模块。所以,既然您似乎使用/ root /作为主文件夹,您可以将此行添加到docker run execution(我没有使用qsub的经验):

-v /local/path/to/submain.py:/root/submain.py

它会将容器的/root/submain.py映射到您的本地submain.py。因此,您无需将子域文件复制到docker镜像。

请注意,您在容器内以root身份运行脚本。因此,如果您运行任何不安全的服务,则可以公开容器可以写入/读取的任何卷或数据。

检查WORKDIRUSER Dockerfile选项也是个好主意。

回答

  

如果这不可能,我如何“附加”submain.py到docker image?

Dockerfile内使用此功能可以解决问题:

COPY submain.py submain.py

请注意,您必须在每次容器内测试之前构建新映像,或者在将其发送到网格之前使用上一个示例中的卷。