web-dev-qa-db-ja.com

名前付きボリュームを混合し、Dockerでマウントをバインドしますか?

名前付きボリュームバインドマウントの混合はどのように機能しますか?次の設定を使用すると、バインドマウントされているパスは、バインドマウントに存在するので、バインドマウント内で引き続き使用できますか? /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"
10
PeaceBringer

ホストボリューム:ホストボリュームの場合、次のように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のコンテンツのみが表示されます。

11
BMitch

答えはバインド伝播を構成することだと思います。

報告します。

編集:バインドマウントされたボリュームとLinuxホストシステムでのみバインド伝播を構成できるようです。

0
PeaceBringer