web-dev-qa-db-ja.com

--volumeで実行されるdocker

私は自分のマシンで開発するためにいくつかのサービスをドッキングしようとしていますが、どのように_docker run --volume=..動作します。たとえば、次のようなことをすると

docker run --volume=/path/to/data:/data [...]

/path/to/dataローカルに(再)作成されるのみ存在しない場合初期データはコンテナの画像からコピーされていますか?
関連ドキュメントへのリンクをいただければ幸いです。

6
planetp

--volumeオプションは、 docker runリファレンスドキュメント で説明されており、専用の Managedコンテナ内のデータ ドキュメント。 マウントのバインド ドキュメントに転送します。

そこで、それは言います:

-vまたは--volumeを使用して、Dockerホストにまだ存在しないファイルまたはディレクトリをバインドマウントすると、-vがエンドポイントを作成します。常にディレクトリとして作成されます。

9

はい、ホスト上のディレクトリFSは、まだ存在しない場合にのみ作成されます。

同時に、Dockerはイメージからバインドマウントされたボリュームに何もコピーしないため、マウントパスはコンテナー内の空のディレクトリとして表示されます。画像にあったものはすべて隠されます。

元のデータをコピーする必要がある場合は、この機能を自分で実装する必要があります。幸いなことに、それは非常に簡単です。

  1. Dockerfileの最後の手順の中で、元のディレクトリを別の場所に移動またはコピーします。例えば。 RUN mv /data /original-data
  2. カスタムスクリプトをイメージに追加します。これはエントリポイントとして機能し、必要なデータをマウントされたボリュームにコピーします(以下のコード例を参照)。 Dockerfileディレクティブ:ADD entrypoint.sh /entrypoint.sh
  3. コンテナの初期化の一部としてスクリプトを呼び出すようDockerに指示するには、ENTRYPOINTディレクティブを追加します。ENTRYPOINT ['/entrypoint.sh']

スクリプト entrypoint.shは次のようになります(簡単な例)。

#!/bin/bash
set -e
SOURCE_DIR=/original-data 
TARGET_DIR=/data
if [ $(find $TARGET_DIR -maxdepth 0 -type d -empty) 2>/dev/null) ]; then
   cp -r --preserve-all $SOURCE_DIR/* $TARGET_DIR/
fi

# continue Docker container initialization, execute CMD
exec $@

画像にエントリポイントスクリプトが既にある場合は、適切なロジックを追加するだけです。

4
Hleb Rubanau