2017-01-27 29 views
3

私はDockerコンテナを正常に構築し、アプリケーションのファイルをDockerfileのコンテナにコピーしました。しかし、入力ファイル(Dockerビルド中にコンテナにコピーされた)を参照するPythonスクリプトを実行しようとしています。なぜ私のスクリプトは入力ファイルを見つけることができないと言っているのか分かりません。私は以下のコンテナを構築するために私が使用したDockerfileと、見つからない入力ファイルを探しているPythonスクリプトの関連部分を含めています。Docker Pythonスクリプトがファイルを見つけることができません

Dockerfile:

FROM alpine:latest 

RUN mkdir myapplication 

COPY . /myapplication 

RUN apk add --update \ 
    python \ 
    py2-pip && \ 
    adduser -D aws 

WORKDIR /home/aws 

RUN mkdir aws && \ 
    pip install --upgrade pip && \ 
    pip install awscli && \ 
    pip install -q --upgrade pip && \ 
    pip install -q --upgrade setuptools && \ 
    pip install -q -r /myapplication/requirements.txt 

CMD ["python", "/myapplication/script.py", "/myapplication/inputfile.txt"] 

Pythonスクリプトの関連部分:エラーが発生したホスト上の

if len(sys.argv) >= 2: 
    sys.exit('ERROR: Received 2 or more arguments. Expected 1: Input file name') 

elif len(sys.argv) == 2: 
    try: 
     with open(sys.argv[1]) as f: 
      topics = f.readlines() 
    except Exception: 
     sys.exit('ERROR: Expected input file %s not found' % sys.argv[1]) 
else: 
    try: 
     with open('inputfile.txt') as f: 
      topics = f.readlines() 
    except: 
     sys.exit('ERROR: Default inputfile.txt not found. No alternate input file was provided') 

ドッカーコマンド:

:上記コマンドから

sudo docker run -it -v $HOME/.aws:/home/aws/.aws discursive python \ 
    /discursive/index_twitter_stream.py 

エラー

ERROR: Default inputfile.txt not found. No alternate input file was provided

AWSの内容は、ホストのAWS資格情報をDockerコンテナに渡してAWSサービスとのやり取りに使用する方法に関するチュートリアルから引き出されています。私はここから要素を使用しました:https://github.com/jdrago999/aws-cli-on-CoreOS

+0

は、/ binに/ bash' 'のエントリ・ポイントをオーバーライドしてみてください。

CMD ["python", "/myapplication/script.py", "/myapplication/inputfile.txt"] 

で容器の内側にある。予想されるすべてのファイルが存在し、予想されるディレクトリなどに存在することを確認してください。 – Tagc

+0

ディレクトリを細かく表示でき、適切な場所にintputfile.txtがあります。 'sudo docker run -it -v $ HOME/.aws:/home/aws/.aws containername ls/myapplication' – LouiseEMastiz

+0

この' CMD'では 'else'に到達することさえ奇妙です。 'sys.argv'の長さは2であるため、' elif'を入力してファイルを開くか、 'else'のコードではなく、そのブランチのコードに基づいて終了してください。 –

答えて

1

これまでに私が特定した2つの問題があります。 Maya Gは以下のコメントの3分の1を指摘しています。スクリプトに与えられた最初の引数は、常に独自の名前であることを

if len(sys.argv) > 2: 
    sys.exit('ERROR: Received more than two arguments. Expected 1: Input file name') 

ベア心​​の中で:

if len(sys.argv) >= 2: 
    sys.exit('ERROR: Received 2 or more arguments. Expected 1: Input file name') 

で:

不正な条件ロジック

あなたが交換する必要があります。つまり、sys.argvに1つまたは2つの引数が必要です。デフォルトのファイル

別の問題を見つけると

の問題は、あなたのドッキングウィンドウコンテナの作業ディレクトリが/home/awsであるということですので、あなたがあなたのPythonスクリプトを実行したときには、これに対する相対パスを解決しようとします。

これはことを意味します

with open('inputfile.txt') as f: 

/home/aws/inputfile.txt、ない/home/aws/myapplication/inputfile.txtとして解決されます。

with open('myapplication/inputfile.txt') as f: 

か(推奨):

あなたはどちらかにコードを変更することでこの問題を解決することができ

with open(os.path.join(os.path.dirname(__file__), 'inputfile.txt')) as f: 

(上記の変化のためのSource

CMD対を使用してENTRYPOINT

はまた、明らかに引数としてmyapplication/inputfile.txtを受けていないあるスクリプトのように思えます。これは、CMDの奇妙なものかもしれません。

私はこれら2つの操作の区別について100%明確ではありませんが、私は常にDockerfilesにENTRYPOINTを使用しています。 this answerを参照し、交換してみてください。あなたが行くと遊ぶことができるように

ENTRYPOINT ["python", "/myapplication/script.py", "/myapplication/inputfile.txt"] 

(感謝マヤG)

+0

CMDコマンドは 'CMD [" python "、" /myapplication/script.py/myapplication/inputfile.txt "]' –

+0

@MayaGでなければならないので、引数を取得しません[docs](https: /docs.docker.com/engine/reference/builder/#cmd)、それは既にうまくいくはずです: 'CMD [" executable "、" param1 "、" param2 "]' – Tagc

+0

あなたは正しいです。たぶんこれは問題を解決しますhttp://stackoverflow.com/questions/32554448/command-line-arguments-to-docker-cmd –

関連する問題