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

情報を追加できますか?特に、少なくともあなたが走っているドッカーコマンド。また、これはigraphをローカルで(ドッカーではなく)実行しているときに機能しますか?また、なぜそれがqsubを実行していますか? – dshockley

+0

はい、私はリモートマシン上で作業しています(sudoの権限がないため、ローカルにはigraphがありません)。 qsubを使用して別のサーバーにジョブを送信し、指定したもの以外のドッカーコマンドは実行しません。ローカルスクリプトのインポートが行われていないときはスクリプトのために働いていましたが、この場合は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 

可能であれば、これをローカル環境でテストして、qsubでジョブを送信する前にpython + dockerの問題を解決するようにしてください。 dockerイメージを実行するジョブを送信するためにqsubを使用することは別の問題です。おそらく、この部分が解決されると、新しい質問を作成する必要があります。

[1]わかりやすくするために、私はpython:3ドッカーの画像から継承して、すべてのPython依存関係をインストールする必要がなくなりました。なんらかの理由でUbuntuが必要な場合は、代わりにそれを試すことができます。あなたがUbuntuを必要としない場合は、上記のDockerfileにRUN pip install igraphを追加することができます(Python 3ではなくPython 2が必要な場合は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に追加します。したがって、submainファイルをdockerイメージにコピーする必要はありません。

コンテナ内でスクリプトをルートとして実行していることに注意してください。したがって、安全でないサービスを実行すると、コンテナが書き込み/読み取りできるボリュームやデータが公開される可能性があります。

WORKDIRUSERドッカーファイルのオプションを確認することもおすすめです。あなたは、すべてのコンテナ内のテストの前に新しいイメージを構築したり、ボリュームを使用する必要があります

COPY submain.py submain.py 

マインド:Dockerfileの内側にこれを使用して

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

への答えで

は、トリックを行います前の例ではグリッドに送信しています。

関連する問題