2016-08-16 33 views
1

使用docker-compose我試圖創建一個共享卷,其中兩個服務都可以使用。我在下面我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

我想你在這裏混合了兩個概念。

  • volumes_from當一個容器有一些應該用於存儲的卷(已安裝或未安裝)時使用。然後,您可以通過引用所需的data-only-containervolumes_from來使用該容器的容量,該容量必須指向容器或(組合)服務名稱。

  • volumes另一方面用於引用本地文件夾或命名卷。因此,必須在撰寫文件的頂級條目volumes中聲明命名卷,就像您已經做過的那樣。

所以你的情況,從volumes_fromvolumes開關應該做的伎倆。有關詳細信息,請參閱參考文檔:https://docs.docker.com/compose/compose-file/#/volumes-volume-driver

+0

這是一個完美而詳細的解釋,以及我對上述答案的建議背後的理論。我們應該結合這兩個好的答案:) –

0

「volumes_from」引用容器。由於您使用了一個名爲卷,你需要「量」:

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

此外,由於您使用的版本2,您需要在自己的services:部分指定,而不是陽明的頂級服務。

1

答案應該是

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

所以sidekiq就是你所謂的data-container,揭露和創建bundler量。然後,您將此卷裝入您需要的所有其他容器中,在您的情況下爲現在的網頁。希望這可以幫助

+1

sidekiq實際上並不是數據容器的傳統定義,因爲它正在從指定卷裝入數據。由於您的數據位於命名卷中,因此在sidekiq上添加額外的依賴項以便在兩個服務之間添加不必要的依賴關係。換句話說,使用這種設計,您無法升級sidekiq而不會銷燬並稍後重新創建Web容器。 – BMitch

+0

交點。 Web正在使用包含器語法進行掛載,而不是卷語法,因此其依賴關係將轉至容器。如果我停止所有的容器,那麼我應該能夠刪除sidekiq /升級sidekiq,對(?)除此之外,升級sidekiq在實際的righti中是沒有意義的,因爲它的'cogniteev/echo'無論如何,對吧?你介意更詳細地解釋你的想法嗎? –

+0

如果你停止所有容器,你可以升級sidekiq。但是,如果您使用命名卷而不是容器卷,則可以升級sidekiq而無需停止網頁(請參閱我發佈的有關如何操作的答案)。這就解耦了每個容器之間的依賴關係,並使它們可獨立升級。它們每個仍然具有相同的數據訪問權限。 – BMitch