Docker Composeバージョン2の「ボリューム」構文はどのように見えるのですか?


43

ドッカーのCompose V1.6.0 +、今の新しい/バージョン2ファイルの構文があるdocker-compose.ymlファイル。変更には、という名前の別のトップレベルキーが含まれvolumesます。これにより、ボリューム定義を1か所で「集中化」できます。

私がやろうとしているのは、そこにボリュームに名前付けて、ローカルホストディスク上の単一のボリューム参照複数パスを持つことです。以下は、Tracebackで終わる例外をスローする例です。

AttributeError: 'list' object has no attribute 'items'

docker-compose.yml

version: '2'

services:
  db:
    image: postgres
    volumes:
      - database:/var/lib/postgres/data

  php:
    image: php-fpm:5.6
    volumes:
      - phpconf:/etc/php/conf.d

  namedvolume:
    container_name: namedvolume
    build: ./Docker/Testvolume
    volumes: 
      - ./Docker/Testvolume/shareme

volumes:
  database:
    - ./Docker/Postgres/db:ro
    - ./Docker/Postgres/ini
  phpconf:
    - ./Docker/PHP-FPM/conf
  singledir: ./Docker/foo
  completemap: ./Docker/bar:/etc/service/conf.d
  - namedvolume:/etc/service/conf.d # < this was a separate attempt w/o the other keys
  … ?

これまで、すべてのDocker Compose docs master-branch Volume構成リファレンス、Docker Compose docs Volume / Volume-Driverリファレンスを読み、GitHubの例を調べて、予想される正しい構文を見つけました。誰も既にそれを使用していないようで(GitHub)、ドキュメントは完全にはほど遠い(docker.com)。また、別のボリュームをとして構築し、serviceで参照しようとしましたがvolumes、それでもうまくいきません。この構文の方法に関するアイデアは次のように見えるはずですか?

回答:


40

volumesキーの目的

名前付きボリュームを作成するためにあります。

それを使用しない場合、ボリュームのハッシュ値の束を見つけます。例:

$ docker volume ls 
DRIVER              VOLUME NAME
local               f004b95d8a3ae11e9b871074e9415e24d536742abfe86b32ffc867f7b7063e55
local               9a148e167e1c722cbdb67c8edc36f02f39caeb2d276e9316e64de36e7bc2c35d

名前付きボリュームでは、次のようなものが得られます。

$ docker volume ls
local               projectname_someconf
local               projectname_otherconf

名前付きボリュームを作成する方法

docker-compose.yml構文は次のとおりです。

version: '2'

services:
    app:
        container_name: app
        volumes_from:
            - appconf
    appconf:
        container_name: appconf
        volumes:
            - ./Docker/AppConf:/var/www/conf

volumes:
    appconf:

networks:
    front:
        driver: bridge

これは上記のような名前付きボリュームを示しています。

ボリュームを一括で削除する方法

多数のハッシュがある場合、クリーンアップするのは非常に困難です。ワンライナーは次のとおりです。

docker volume rm $(docker volume ls |awk '{print $2}')

編集: @ArthurTaccaがコメントで指摘したように、覚えやすい方法があります。

docker volume rm $(docker volume ls -q)

名前付きボリュームに関する詳細を取得する方法

ハッシュを検索する必要がなくなったので、ハッシュにアクセスして、… という名前で呼び出すことができます 

docker volume inspect <volume_name>

# Example:
$ docker volume inspect projectname_appconf

[
    {
        "Name": "projectname_appconf",
        "Driver": "local",
        "Mountpoint": "/mnt/sda1/var/lib/docker/volumes/projectname_appconf/_data"
    }
]

補足:docker-compose downボリュームを作成する前に、サービスを新たに開始することをお勧めします。

使用している場合はBoot2Docker / ドッカーマシンを、あなたがする必要がありますdocker-machine sshし、sudo -i実行する前に、ls -la /mnt/…そのボリュームの-あなたのホストマシンは、VMがでプロビジョニングされドッカーマシン


1
非常に良い答え。乾杯。新しいdocker-composeボリュームを見つけるために戻ってくる多くのことを片付けました。
デレク・アデア

これらはどこで見つけましたか?Docker Docsよりもはるかに多いようです?
デレク・アデア

1
@DerekAdairありがとう。ただし、左上の統計を読むとわかるように、この回答はこのトピックのGoogle検索エンジンの結果ページでよく参照されています。
カイザー

1
代わりに$(docker volume ls |awk '{print $2}')使用できます$(docker volume ls -q)これは簡単なだけでなく、最初の行に「VOLUME」を出力しません。
アーサータッカ

2
これは正しくありません。これは、それがするように見えるようにするものではありません。別のコンテナからボリュームのリストvolumes_from継承することです。名前付きボリュームを使用するには、サービスレベルの構文を使用- NAME:DESTし、トップレベルvolumesキーでパスを設定します。この例では(これを書いている時点では)、名前付きボリュームに加えて標準ボリュームを作成しています。名前付きボリュームは単純に使用されていません。
トレヴォーリ

13

私がそれを理解する方法は、グローバルvolumes:セクションを使用して

  • ボリューム名を定義する
  • 名前付きボリュームを別のボリューム名で使用可能にします
  • 名前付きボリュームのドライバーとドライバーオプションを指定する

グローバルセクションのボリュームは、を指定しない限り自動作成されますexternal: true。そのvolumes:セクションの各サービスにそのボリュームをマウントする場所を伝える必要があります。

これは非常に簡単な例です:

version: '2'
volumes:
  project:
services:
  one:
    volumes:
      - project:/bar
  two:
    volumes:
      - project:/foo

のグローバルvolumes:エントリprojectにより、名前付きボリュームprojectが作成されます。その後/bar、サービス1および/fooサービス2 としてマウントされます。両方のサービスはボリュームのデータを共有し、それを読み書きできます。

あなたがやろうとしていることは可能だとは思いません(複数のパスを単一のボリュームに変え、異なるr / wフラグを付けます)。場合、それは可能であり、そしておそらくいくつかの他の手段を介してこれらの性質を持つという名前のボリュームを作成する方法を見つけ、その後、外部ボリュームとしてそれを追加すること:

volumes:
  mymagicvolume:
    external: true

1
すでに賛成されましたが、今日はそれを回避する時間を見つけて、拡張データを追加しました。ご助力いただきありがとうございます!質問:ボリュームに名前を付けてprojectからとして参照するとproject:/barproject実際にパスはどこで定義されていますか?
カイザー

ドッキングウィンドウ-COMPOSEは自動的に/ var / libに/ドッキングウィンドウ/ボリューム/ボリューム名の下という名前のボリュームとしてそれらを作成します
JamesCW

申し訳ありませんが、まだdockerがproject:エイリアスのパスを取得する場所がわかりませんか?私は共有したい場合はどのようにドッキングウィンドウのノウハウを行い、言う./some_folder/some_subfolder/yet_another_subfolderone:及びtwo:コンテナ?
アレクサンダーロミア

その場合、最上位のボリュームの下にある「project:<whateverpath>」:セクション
バリントバコ

5

たとえば、バージョン2をチェックしてください。また、ボリューム構成リファレンスも確認してください。

私の例:(バージョン1)

$ tail -4 docker-compose.yml 
  volumes:
    - ./etc/nginx/conf.d:/etc/nginx/conf.d:ro
    - ./var/log/nginx:/var/log/nginx:rw
    - ./var/www/html:/var/www/html:rw
$ 

1
これはまさに質問でリンクしたものであり、したがって私の質問には答えません。ホストからの異なるディレクトリを名前付きボリュームとして複数のサービスにマッピングする方法の例を投稿してみませんか?
カイザー

私のリンクはISそれが指す、異なるVersion 2)文書のセクション
alexus

私の悪い。私もそのリンクを忘れました。質問のYMLの内容を見ると、別のトップレベルvolumesキーを使用して回避しようとしていることがはっきりとわかります。私が理解できないのはdocker-compose.yml、バージョン1構文の部分が私を説明するためのものであるということです。
カイザー

5

あなたがしようとしていることは、ここで見たものとほぼ同じだと思います。つまり、現在、ホスト上のマウントポイントを参照する名前付きボリュームを作成することはできません。名前付きボリュームを作成してコンテナ間でデータを共有できますが、データはボリューム自体にのみ存在し、ボリュームを削除すると消えます。

名前付きボリュームのマウントが提案されていますが、残念ながら近い将来コアに追加されません。ただし、local-persistという名前のdockerプラグインを使用することで可能です。


3
1.11または1.12以降名前付きボリュームのマウント重要です。
カイザー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.