名前付きボリュームとバインドマウントの混合はどのように機能しますか?次の設定を使用すると、バインドマウントされているパスは、バインドマウントに存在するので、バインドマウント内で引き続き使用できますか? /var/www/html/wp-content/uploads
名前付きボリュームにアタッチする別のコンテナーを使用すると、別のコンテナーのビューからこれらのパスが完全に空であるため、そうではないことが示されているようです。これがある意味で機能する方法はありますか?
volumes:
- "wordpress:/var/www/html"
- "./wordpress/uploads:/var/www/html/wp-content/uploads"
- "./wordpress/plugins:/var/www/html/wp-content/plugins"
- "./wordpress/themes:/var/www/html/wp-content/themes"
ホストボリューム:ホストボリュームの場合、次のようにDocker作成ファイルのパスで定義されます。
volumes:
- "./wordpress/uploads:/var/www/html/wp-content/uploads"
イメージの内容からホストディレクトリの初期化を受け取ることはありません。これは仕様によるものです。
名前付きボリューム:ローカルディレクトリにマップする名前付きボリュームを定義できます。
version: "2"
services:
your-service:
volumes:
- uploads:/var/www/html/wp-content/uploads
volumes:
uploads:
driver: local
driver_opts:
type: none
o: bind
device: /path/on/Host/to/wordpress/uploads
これにより、名前付きボリュームの初期化プロパティが提供されます。ホストディレクトリが空の場合、コンテナの作成時にdockerは/ var/www/html/wp-content/uploadsにあるイメージのコンテンツを/ path/on/Host/to/wordpress/uploadsにコピーします。
Dockerを使用したネストされたマウント:ネストされたボリュームマウントが複数ある場合でも、dockerは親ボリュームからではなく、イメージディレクトリの内容からコピーします。
これがその初期化の例です。ファイルシステムから始める:
testvol/
data-image/
sub-dir/
from-image
data-submount/
Dockerfile
docker-compose.yml
Dockerfileには次のものが含まれています。
FROM busybox
COPY data-image/ /data
Docker-compose.ymlには次のものが含まれています。
version: "2"
services:
test:
build: .
image: test-vol
command: find /data
volumes:
- data:/data
- subdir:/data/sub-dir
volumes:
data:
subdir:
driver: local
driver_opts:
type: none
o: bind
device: /path/on/Host/test-vol/data-submount
そして、指定されたボリュームが初期化されました:
$ docker run -it --rm -v testvol_data:/data busybox find /data
/data
/data/sub-dir
/data/sub-dir/from-named-vol
テストを実行すると、コピーがfrom-image
ではなくfrom-named-vol
になっていることがわかります。
$ docker-compose -f docker-compose.bind.yml up
...
Attaching to testvol_test_1
test_1 | /data
test_1 | /data/sub-dir
test_1 | /data/sub-dir/from-image
testvol_test_1 exited with code 0
そして、dockerはこれをホストファイルシステムにコピーしました:
$ ls -l data-submount/
total 0
-rw-r--r-- 1 root root 0 Jan 15 08:08 from-image
Linuxのネストされたマウント:あなたの質問から、マウント自体がLinuxでどのように機能するかについて混乱があるようです。各ボリュームマウントは、コンテナのマウント名前空間で実行されます。この名前空間は、コンテナにファイルシステムツリーの独自のビューを提供します。ボリュームをそのツリーにマウントする場合、親ファイルシステムのコンテンツを変更するのではなく、その場所にある親のコンテンツをカバーするだけです。すべての変更は、新しくマウントされたディレクトリで直接行われ、マウントを解除すると、親ディレクトリが元の状態で表示されます。
したがって、1つのコンテナに2つのネストされたディレクトリをマウントする場合、たとえば/data
と/data/a
を実行し、次に/data
を2番目のコンテナーにマウントすると、最初のコンテナーの/data/a
は2番目のコンテナーに表示されず、/data
のコンテンツのみが表示されます。
答えはバインド伝播を構成することだと思います。
報告します。
編集:バインドマウントされたボリュームとLinuxホストシステムでのみバインド伝播を構成できるようです。