2017-08-24 190 views
0

我有一个本地脚本main.py,它导入另一个本地脚本submain.py运行在码头中导入本地脚本的python脚本

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码头形象?

+1

你可以添加更多的信息吗?特别是,至少你正在运行的docker命令。此外,当你在本地运行igraph时(这不是在docker中),它会起作用吗?另外为什么它运行qsub? – dshockley

+0

是的,原因是我在远程机器上工作(为此我没有sudo权限,因此本地没有igraph)。我使用qsub将作业提交给另一台服务器,除了指定的命令之外,我不运行任何docker命令。当没有导入本地脚本时,它适用于脚本,但是,在这种情况下,它不知道在哪里查找submain.py。 –

+0

如果我们忘记了通过qsub启动的事实,那么通过docker命令运行脚本的命令/ Dockerfile将是什么? –

回答

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 

如果可能的话,你应该尝试在本地环境中测试这个,以解决python + docker问题,然后再转移到使用qsub提交作业。使用qsub提交运行Docker镜像的作业是一个不同的问题 - 一旦解决了这部分问题,可能应该创建一个新的问题。

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

0

在回答

How can I run my script main.py with additional script stored locally?

Python会尝试使用它的库路径和当前目录加载一个模块。所以,既然你似乎可以用/根/作为主文件夹,您可以添加此行码头工人,运行执行(我没有通过qsub经验):

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

体将容器的/根/ submain.py添加到您的本地submain.py。因此,您不需要将您的子域文件复制到泊坞窗图像。

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

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

在回答使用这个Dockerfile内会做的伎俩

If this not possible, how I "attach" submain.py to docker image?

COPY submain.py submain.py 

记住,你必须在每个容器内测试之前建立一个新的形象,或者使用一个体积在之前的示例中,然后将其发送到网格。