2017-05-31 17 views
11

मैं डॉकर-कंपोज़ और v3 का उपयोग कर रहा हूं। मैं डोकर में एक मात्रा माउंट करने के लिए कोशिश कर रहा हूँ:डॉकर लिखें - एकाधिक कंटेनर के बीच नामित वॉल्यूम साझा करें

./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: 

यहाँ एक उदाहरण है config है कि मैं बेहतर समझ के लिए उपयोग में कंटेनर के बीच साझा किया जा सकता है। मैं अपने 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

बात यह है कि नामित वॉल्यूम केवल सिंटैक्स और स्पष्ट कोड के बारे में कुछ नहीं है। यह डॉकर डेटा स्थापना निर्देशिका के अंदर एक वॉल्यूम बनाएगा और आपके पास आपकी स्थानीय फाइलें नहीं होंगी (./appdata)। क्या यह आपके लिए उपयोगी है? – Robert

+1

मुझे निश्चित रूप से '।/Appdata' की आवश्यकता है, यही वह है जो मैं करने की कोशिश कर रहा हूं। यद्यपि यह उत्तर यहां छोड़ दें :) +1 – Jimbo

संबंधित मुद्दे