2017-04-14 10 views
2

My Dockerfile私のローカルマシンからテキストファイルを読み込む必要のあるpythonスクリプトを実行します。 run.pyでコンテナの実行中にDockerがローカルシステムからファイルを読み取る

Dockerfile

FROM fedeg/python-vim:2 
ADD . /code 
WORKDIR /code 
RUN pip install -r requirements.txt 
COPY file.txt /data/file.txt 
CMD ["python", "run.py"] 

テキストファイルを読み込み機能があります:

def read_file(filename): 
    lines = [line.rstrip('\n') for line in open(filename)] 
    return lines 

私は他の誰かにこのイメージを渡すことだったし、彼らならば、私は思っていましたこれを実行すると、すでに画像の中にfile.txtが保存されているのでしょうか、画像が起動されたときにその人のローカルマシンのfile.txtを見つけられるでしょうか?

私が望むのは、ドッカーが画像が実行されているマシン上でfile.txtという名前を探すために、私のローカルマシンから提供されたfile.txtではなく、他のfile.txtの内容。

答えて

1

はいイメージの中に保存されます。

イメージには、ドッカーファイルに記述されているすべての変更が含まれています。そこで起こっていることはイメージの一部であり、イメージを与える人が使用できるようになります。

docker runまたはdockerサービスで作成したコンテナで起こったことは、画像には何も影響しません。あなたが望むなら、それを新しいイメージに変えるためにコンテナをドッキングすることができます。

+0

他の誰かが画像を持っていて、実行したいfile.txtが違う場合は、自分の画像に既にあるfile.txtをどのように置き換えるのですか? – jxn

+0

誰でもファイルを追加できるという考えがある場合は、マウントされたボリュームを使用し、そのイメージのデータを持たないようにする必要があります。コンテナボリュームにボリュームをマウントすることはできますが、マウントしたデータが使用されます。 – herm

+0

コンテナとホストの間でファイルをコピーするために[docker cp](https://docs.docker.com/engine/reference/commandline/cp/)を使用することもできることを思い出しました – herm

1

@hermは、あなたがやったようにコンテナをビルドすることによって指摘したように、file.txtはコンテナの中に保存されています。 、あなたが望むものを達成DockerfileからCOPYを削除し、代わりに、実行時に-vオプションを指定してホストマシン上でfile.txtなどを含むフォルダをマウントする

docker run -v /folder/with/file:/data image_name 

場所/フォルダ/と/ fileはfile.txtを含むフォルダへのパス、image_nameはドッカーコンテナの名前です。

実行中のコンテナの/ dataの内容は、/ folder/with/fileフォルダの内容になります。

EDIT:

まただけでなく、ファイルをマウントすることができます:

docker run -v /folder/with/file/file.txt:/data/file.txt image_name 

は、しかし、あなたがファイルを編集する必要がある場合は、この問題を与えるかもしれないことに注意してください。 viと--in-場所sedを含むファイルを編集するために使用される多くのツールは、inode変更になる場合があります。「データボリュームとしてマウントホストファイル」Docker Docs

注を参照してください。 Docker v1.1.0以降、これは "sed:名前を変更できません./sedKdJ9Dy:デバイスまたはリソースがビジー状態です"というエラーが表示されます。マウントされたファイルを編集する場合は、代わりに親ディレクトリをマウントするのが最も簡単です。

+0

私の現在のフォルダが '〜/ Desktop/docker_test/work'で、テキストファイルが'〜/ Desktop/docker_test'にある場合、構文は次のようになります: 'docker run -v〜/ Desktop/docker_test/work:/ data image_name' – jxn

+0

そうではありません...あなたはfile.txtを使ってフォルダをマウントしたいです: 'docker run -v〜/ Desktop/docker_test:/ data image_name' – saxitoxin

+0

ファイル名はどうですか? 'docker run -v〜/ Desktop/docker_test/file.txt:/ data image_name'私はフォルダをマウントしましたが、pythonエラーはファイルが見つからないということです – jxn

関連する問題