Docker Compose-複数のコンテナー間で名前付きボリュームを共有する


105

docker-composeとv3を使用しています。Dockerにボリュームをマウントしようとしています:

./appdata:/appdata

これをボリュームとして取得し、複数のコンテナからそのボリュームを参照したいと思います。ボリューム構成の参照のみを示しdata-volume:ていない値を持つという名前のボリュームとしては、それは上記のように見えないようにします。

services:

    nginx:
        build: ./nginx/
        ports:
            - 80:80
        links:
            - php
        volumes:
            - app-volume

    php:
        build: ./php/
        expose:
            - 9000
        volumes:
            - app-volume

volumes:
     app-volume: ./appdata:/appdata

これは私に与えます:

エラー:ファイル './docker-compose.yml'では、ボリューム 'app-volume'は文字列ではなくマッピングである必要があります。

volumesキーと値のペアを変更する必要があることは明らかですが、サービス間でボリュームを共有できるように、これを変更する方法がわかりません。

私もチェックアウトしましたvolumes_fromが、これは事実上、他のコンテナからの継承を許可するだけです。volumes_from必要なマッピングが含まれている別のコンテナーを誰かが使用しているのを見たことがありますcommand: trueが、コンテナーが実際には実行されないように設定されているため、ハッキングのように見えます。

これどうやってするの?


注、私次の作業をています:

nginx:
    volumes:
        - ./appdata:/appdata
php:
    volumes:
        - ./appdata:/appdata

しかし、それは単なる複製であり、名前付きボリュームが回避するのに役立つことを願っています:-)


あなたはこの答えで答えを見つけることができます:stackoverflow.com/a/49920624
Isen Ng

回答:


141

名前付きボリュームは、次の方法でコンテナー間で共有できます。

services:
    nginx:
        build: ./nginx/
        ports:
            - 80:80
        links:
            - php
        volumes:
            - app-volume:location_in_the_container

    php:
        build: ./php/
        expose:
            - 9000
        volumes:
            - app-volume:location_in_the_container

volumes:
     app-volume: 

以下は、理解を深めるために使用する設定例です。私はwebコンテナーから生成された静的ファイルを名前付きボリュームに公開しています。static-contentこのボリュームは、nginxコンテナーによって読み取られ、提供されます。

services:
  nginx:
    container_name: nginx
    build: ./nginx/

    volumes:
      - static-content:/usr/src/app

  web:
    container_name: web
    env_file: .env
    volumes:
      - static-content:/usr/src/app/public
    environment:
      - NODE_ENV=production

    command: npm run package

volumes:
  static-content:

79
static_contentホストファイルシステム上のの場所をどこに設定しますか?
Travis Bear

10
の空白app-volume: location_in_the_containerは間違っています。
hasufell 2018年

4
どのような場合/usr/src/appでのnginxコンテナと/usr/src/app/publicにおけるwebコンテナの両方のものを使用して、なぜされるオリジナルのコンテンツを、得ましたか。
jallen0927

2
この使用例(コンテナー間でデータを共有)の@TravisBearは、ホスト上で実際に持つ必要はありません。静的データの例は素晴らしいです- collectstaticあるコンテナーで実行し、別のコンテナーで結果を利用できるようにしたいが、ホストフォルダーは気にしない
ゴッドファーザー

7
@Kannaj TravisBearの質問は、私が最も混乱している問題を正しく特定するものです。構成ファイルで、名前付きボリュームのソースをどこで指定できますか?名前付きボリュームをホスト上のどこに保存するかを決定するために、Dockerエンジンに任せたくありません。パスを指定します。
ベンコリンズ

33

これは名前付きボリュームを使用せずにそれを解決します:

      volumes:
          - ./appdata:/appdata

したがって、次のようになります。

services:

  nginx:
      build: ./nginx/
      ports:
          - 80:80
      links:
          - php
      volumes:
          - ./appdata:/appdata

  php:
      build: ./php/
      expose:
          - 9000
      volumes:
          - ./appdata:/appdata

4
あ、いいタイミング!私はこれを上記で行いました(私の変更を参照してください)。ただし、まだマッピングを複製しているようです。これを3つ以上のコンテナーで使用すると、大きくなります。名前付きコンテナーを使用して、この重複を回避できますか?
神保

問題は、名前付きボリュームは構文と明確なコードのみに関するものではないということです。これにより、Dockerデータインストールディレクトリ内にボリュームが作成され、そこにローカルファイル(./appdata)がなくなります。とにかくそれはあなたにとって便利ですか?
ロバート

1
私は間違いなくを必要./appdataとしています。それが私がやろうとしていることです。ただし、この回答はここに残してください:) +1
神保

2
同じ画像の2つのコンテナーがあり、1つのコンテナーで(アップロードファイルサービスを介して)ファイルをアップロードすると、他のコンテナーで使用できるようになりますか?そうでない場合、どうすればよいですか?
magnoz 2018年

0

dockerという名前のdockerは、バージョンdocker-compose 3から削除されました。

ただし、拡張フィールドを使用して、ボリュームソースの重複を回避し、将来のタイプミスを防ぐことができます。

version: '3.5'

x-services-volume:
  &services-volume
  type: bind
  source: ./appdata
  target: /appdata

services:

    nginx:
        build: ./nginx/
        ports:
            - 80:80
        links:
            - php
        volumes: *services-volume

    php:
        build: ./php/
        expose:
            - 9000
        # Use same way as for nginx if target override not needed.
        volumes:
            - <<: *services-volume
            target: /opt/target-override

注:この機能は、バージョン3.4ファイル形式から利用できます。


* services-volumeが上記の値セットへのポインターにすぎない場合、これはすばらしいように見えます...試してみる必要があります。
神保

@Jimboはい、そうです。また、docker-composeファイルのバージョンは3.4+である必要があります
Andriy Ivaneyko

2
名前付きボリューム(別名トップレベルvolumesフィールド)は、のv3docker-composeではまだ存在するようです。
Alex Povel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.