2017-01-23 15 views
0

Dockerボリュームをしばらく読もうとしていましたが、まだ何かが見当たりません。ユーザー指定の場所でボリュームを初期化する

このDockerfileを取る:(ドキュメントから撮影)

FROM ubuntu 
RUN mkdir /myvol 
RUN echo "hello world" > /myvol/greeting 
VOLUME /myvol 

私が構築し、単にdocker run <img>としてこれを実行すると、新しいボリュームが作成された(その名のdocker inspect <containerid>を使用して見つけることができます)。 /var/lib/docker/volumes/<volumeid>の内容は、greetingのファイルは、期待通りにhello worldです。

これまでのところとても良いです。さて、私は、ユーザーとして、このボリュームをカスタムの場所に配置したいと考えていました。私はdocker run -v /host/path/:/myvolを実行します。これはではなく、の作業はもう終了します。 /host/pathが作成されます(存在しない場合)。

Dockerfileのボリュームにいくつかのファイルを置くにはどうすればいいですか?ユーザーはこのボリュームをどこに置くかを選択できますか?これは私には、ボリュームディレクティブを最初に使用する理由の1つと思われます。

答えて

0

だから、質問は、どのように私は、彼らがこの ボリュームを置く場所をユーザーが選択できるようにしながら、 Dockerfileにボリュームにいくつかのファイルを置けばいいのですか?

あなたはありません。ボリュームはランタイムに作成され、Dockerfileはビルド時に参照されます。

あなたのコンテナを実行すると、ユーザーは環境変数にボリュームへのパスを提供することができたときに任意場所でボリュームを事前移入することができ、その後、そのコピーENTRYPOINTスクリプトを持つようにしたい場合はコンテナの起動時にファイルをボリュームにコピーします。

別の方法として、特定のパスの使用を要求し、ユーザーがそのパス上に新しい空のボリュームをマウントすると、Dockerはそのディレクトリの内容をボリュームにコピーします。例えば、私が持っている場合:

FROM alpine 
RUN mkdir /data; echo "This is a test" > /data/datafile 
VOLUME /data 

そして、私はそのから画像testimageを構築し、実行します。私は/dataの私のボリュームがファイル(複数可)を含んでいることがわかり

docker run -it testimage sh 

を根底からファイルシステム:私はその場所にホスト・パスをマウントする場合、私がしなければ

/ # ls /data 
datafile 

これは、例えば、動作しません。

host# mkdir /tmp/empty 
host# docker run -it -v /tmp/empty:/data testimage sh 

次いで、得られたパスは空になります。

/ # ls /data 
/# 

これはENTRYPOINTスクリプトは、ターゲットディレクトリを移入するために使用することができたで別の状況です。

+1

イメージの実行時にボリュームが作成されることを理解しています。ただし、-vオプションを使用しないと、ボリュームは実行時にビルド時に指定されたファイルに移入されます。私はVOLUME指令の背後にある理由を考えようとしていました。この時点で私が見ることのできる唯一のものは、ホスト上に保存されているイメージ/コンテナのいくつかのフォルダを永続化するのではなく、Dockerに伝えることです(ファイルは 'docker run )。デバッグの場合は?非常にニッチな用途に見えますので、何かが欠けているはずです。 –

関連する問題