2016-08-16 3 views
1

docker-composeを使用しています。私のサービスのうちの2つが両方を使用できる共有ボリュームを作成しようとしています。私は私のdocker-compose.ymlサービスXは、サービスまたはコンテナの名前ではないYからボリュームをマウントします。

version: '2' 
volumes: 
    bundler: 
    driver: local 
sidekiq: 
    build: . 
    volumes_from: 
    - bundler:/.bundle 
web: 
    build: . 
    volumes_from: 
    - bundler:/.bundle 

に次のように持っているしかし、これは私を仕事と与えません。

ERROR: Service "sidekiq" mounts volumes from "bundler", which is not the name of a service or container.

ドッカ - コンを使用してこれを行うのが正しい方法は何ですか?

答えて

2

ここでは2つのコンセプトを混在させると思います。

  • volumes_fromつの容器は、貯蔵のために使用されるべきいくつかのボリューム(マウントまたはしない)を有しているときに使用されます。このコンテナのボリュームを使用するには、というvolumes_fromを参照してください。これは、コンテナまたは(作成)サービス名を指す必要があります。一方、ローカルフォルダまたは名前付きボリュームの参照には、

  • volumesが使用されます。名前付きボリュームは、既に作成したように、作成ファイルのトップレベルエントリvolumesで宣言する必要があります。

だからあなたの場合には、volumes_fromからvolumesへの切り替えは、トリックを行う必要があります。詳細については、リファレンスドキュメントを参照してください。https://docs.docker.com/compose/compose-file/#/volumes-volume-driver

+0

を解決することができます。これは上記の答えに対する私の提案の背景にある完全で詳細な説明と理論です。我々は良い答えのために両方を組み合わせる必要があります:) –

0

「volumes_from」はコンテナを参照します。あなたはバージョン2を使用しているので、

version: '2' 
volumes: 
    bundler: 
    driver: local 
services: 
    sidekiq: 
    build: . 
    volumes: 
     - bundler:/.bundle 
    web: 
    build: . 
    volumes: 
     - bundler:/.bundle 

はまた、あなたが自分のservices:セクションの代わりに、YMLのトップレベルのサービスを指定する必要があります:あなたが名前のボリュームを使用しているので、あなたは「ボリューム」が必要。

1

答えは

version: '2' 
volumes: 
    bundler: 
    driver: local 
sidekiq: 
    build: . 
    volumes: 
    - bundler:/.bundle 
web: 
    build: . 
    volumes_from: 
    - sidekiq:rw 

だからsidekiqは、あなたがそうさらすと bundlerボリュームを作成し、 data-containerと呼ばれるべきです。次に、このボリュームを他のすべてのコンテナにマウントします。これが欲しいと思っています

+1

sidekiqは、名前付きボリュームからデータをマウントしているため、データコンテナの伝統的な定義ではありません。データが名前付きボリュームにあるため、sidekiqに余分な依存関係を追加すると、2つのサービス間に不要な依存関係が追加されます。言い換えれば、この設計では、Webコンテナを破棄せずに後で再作成することなく、sidekiqをアップグレードすることはできません。 – BMitch

+0

インタースティングポイント。 Webは、ボリューム構文ではなくコンテナ構文を使用してマウントされているため、依存関係はコンテナに移動します。もし私がすべてのコンテナを止めれば、sidekiqをアップグレードすることができるはずですか?sidekiqをアップグレードしてください(?)それに加えて、sidekiqをアップグレードすることは実用的なrightiでは意味をなさないでしょう、とにかく 'cogniteev/echo'ですか?あなたの考えをより詳しく説明してもらえますか? –

+0

すべてのコンテナを停止すると、sidekiqをアップグレードできます。しかし、コンテナボリュームの代わりに名前付きボリュームを使用する場合は、Webを停止することなくサイドキックをアップグレードすることができます(その方法については、私が投稿した回答を参照してください)。これにより、各コンテナ間の依存関係が切り離され、独立してアップグレード可能になります。彼らはそれぞれが依然としてデータへの同一のアクセス権を持っています。 – BMitch

関連する問題