2017-05-31 139 views
11

我使用的是docker-compose和v3。我想在泊塢窗裝入卷:Docker撰寫 - 在多個容器之間共享命名卷

./appdata:/appdata

我想有這樣的體積,然後引用從多個容器該卷。 volume configuration reference只顯示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 

這給了我:

ERROR: In file './docker-compose.yml', volume 'app-volume' must be a mapping not a string.

顯然,我知道自己需要改變volumes鍵/值對的,但我不知道怎麼改變這種做法,我可以共享的卷在服務之間。

我也檢出了volumes_from但這實際上只允許從其他容器繼承。我看到有人在另一個包含他們想要的映射的容器上使用volumes_from,但是設置了command: true以便容器永遠不會真正運行,對我來說這看起來像是黑客。

我該怎麼做?


注意,我有以下工作:

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

但是,這只是重複和東西我希望一個名爲體積可以幫助我避免:-)

回答

15

命名卷可以跨容器通過以下方式

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: 
+0

但我在我的例子中使用了兩個位置,一個主機和一個容器。最初它看起來像這樣:' - ./appdata:/ appdata'但是對於你的解決方案,我只能看到其中的一個值? – Jimbo

+0

這兩個容器都可以寫入卷AFAIK。所以如果您將某個文件夾從您的某個容器展開到指定的卷中,則可以看到該文件夾​​並被其他容器覆蓋,反之亦然。如果它仍然不清楚 - 我會粘貼我的示例代碼來嘗試更好地解釋它 – Kannaj

+1

它必須是「正確的答案」。 –

3

這解決了它沒有使用命名卷:

 volumes: 
      - ./appdata:/appdata 

因此,它看起來像:

services: 

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

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

嗯,不錯的時機服了!我在上面做了這個(看我的變化)。但是,看起來我們仍然在複製映射。如果我在3個容器中使用它,它會變得很大。我們可以使用命名的容器來避免這種重複嗎? – Jimbo

+0

問題是命名卷不僅僅是語法和清晰的代碼。它將在docker數據安裝目錄內創建一個卷,並且你不會有你的本地文件(./appdata)。無論如何對你有用嗎? – Robert

+1

我絕對需要'。/ appdata',這正是我想要做的。儘管在這裏留下這個答案:) +1 – Jimbo