2017-08-24 132 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 

記住,你必須在每個容器內測試之前建立一個新的形象,或者使用一個體積在之前的示例中,然後將其發送到網格。