我有一个本地脚本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镜像?
答案 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身份运行脚本。因此,如果您运行任何不安全的服务,则可以公开容器可以写入/读取的任何卷或数据。
检查WORKDIR和USER Dockerfile选项也是个好主意。
回答
如果这不可能,我如何“附加”submain.py到docker image?
在Dockerfile
内使用此功能可以解决问题:
COPY submain.py submain.py
请注意,您必须在每次容器内测试之前构建新映像,或者在将其发送到网格之前使用上一个示例中的卷。