Docker Compose - कई कंटेनरों के बीच नाम का वॉल्यूम साझा करें


109

मैं docker-compose और v3 का उपयोग कर रहा हूं। मैं डॉकटर में वॉल्यूम माउंट करने की कोशिश कर रहा हूं:

./appdata:/appdata

मैं इसे वॉल्यूम के रूप में लेना चाहता हूं और फिर कई कंटेनरों से उस वॉल्यूम को संदर्भित करता हूं। मात्रा विन्यास संदर्भ केवल शो 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

यह मुझे देता है:

त्रुटि: फ़ाइल './docker-compose.yml' में, वॉल्यूम 'ऐप-वॉल्यूम' स्ट्रिंग नहीं एक मैपिंग होनी चाहिए।

जाहिर है मुझे पता है कि मुझे volumesकुंजी / मूल्य जोड़ी बदलने की आवश्यकता है , लेकिन मुझे यकीन नहीं है कि इसे कैसे बदलना है ताकि मैं सेवाओं के बीच एक वॉल्यूम साझा कर सकूं।

मैंने भी जांच की है, volumes_fromलेकिन यह प्रभावी रूप से अन्य कंटेनरों से विरासत की अनुमति देता है। मैंने देखा है कि कोई volumes_fromअन्य कंटेनर का उपयोग करता है जिसमें मैपिंग वे चाहते हैं, लेकिन command: trueसेट के साथ ताकि कंटेनर वास्तव में कभी न चले, जो मुझे सिर्फ एक हैक की तरह लगता है।

मैं यह कैसे कर सकता हूँ?


ध्यान दें, मेरे पास निम्नलिखित कार्य हैं:

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

लेकिन यह सिर्फ दोहराव है और कुछ ऐसा है जिसकी मैं उम्मीद कर रहा हूं कि नामांकित वॉल्यूम मुझे बचने में मदद कर सकता है :-)


इसका जवाब आप इस उत्तर में पा सकते हैं: stackoverflow.com/a/49920624
Isen Ng

जवाबों:


144

नामित संस्करणों को निम्नलिखित तरीकों से कंटेनरों में साझा किया जा सकता है:

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:

79
आप static_contentहोस्ट फ़ाइल सिस्टम पर स्थान कहाँ सेट करते हैं ?
ट्रैविस बीयर

10
व्हाट्सएप app-volume: location_in_the_containerगलत है।
हैफेल

5
क्या होगा अगर /usr/src/appमें nginxकंटेनर और /usr/src/app/publicमें webकंटेनर दोनों मूल सामग्री है, जो एक का उपयोग किया जाएगा और क्यों है?
jallen0927

2
इस प्रयोग के मामले के लिए @TravisBear (कंटेनरों के बीच डेटा साझा करना) वास्तव में इसे होस्ट पर रखने की कोई आवश्यकता नहीं है। स्थैतिक डेटा के साथ उदाहरण महान है - आप collectstaticएक कंटेनर में निष्पादित करते हैं और परिणाम एक दूसरे में उपलब्ध होना चाहते हैं, लेकिन आप मेजबान फ़ोल्डर की परवाह नहीं करते हैं
गॉडफादर

7
@ कन्नज ट्रैविसबियर का प्रश्न वह है जो उस समस्या की सही पहचान करता है जिसे मैं सबसे अधिक भ्रमित करता हूं। कैसे लिखें फ़ाइल में आप निर्दिष्ट कर सकते हैं कि नामित वॉल्यूम को कहां खट्टा किया गया है? मैं इसे होस्ट करने के लिए नामित वॉल्यूम को संग्रहीत करने के लिए निर्धारित करने के लिए docker इंजन पर छोड़ना नहीं चाहता, मैं एक पथ निर्दिष्ट करना चाहता हूं।
बेन कॉलिन्स

33

यह नामांकित संस्करणों का उपयोग किए बिना इसे हल करता है:

      volumes:
          - ./appdata:/appdata

तो, ऐसा दिखता है:

services:

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

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

4
आह, अच्छा समय! मैंने यह ऊपर किया है (मेरा परिवर्तन देखें)। हालाँकि, ऐसा लगता है कि हम अभी भी मानचित्रण की नकल कर रहे हैं। यदि मैं 3 से अधिक कंटेनरों में इसका उपयोग करता हूं, तो यह बड़ा हो जाता है। क्या हम इस दोहराव से बचने के लिए नामित कंटेनरों का उपयोग कर सकते हैं?
जिम्बो

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

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

2
यदि मेरे पास एक ही छवि के दो कंटेनर हैं, तो एक कंटेनर में फ़ाइल (अपलोड फ़ाइल सेवा के माध्यम से) अपलोड करना, यह दूसरे में उपलब्ध होने वाला है? यदि नहीं, तो मैं यह कैसे कर सकता हूं?
मैगोज़

1

संस्करणों के डॉक-कम्पोज 3 से शुरू होने वाले डॉक नाम के संस्करणों को हटा दिया गया था।

हालाँकि, आप वॉल्यूम फ़ील्ड को डुप्लिकेट करने से बचने के लिए एक्सटेंशन का उपयोग कर सकते हैं और भविष्य के टाइपोस से खुद को रोक सकते हैं:

version: '3.5'

x-services-volume:
  &services-volume
  type: bind
  source: ./appdata
  target: /appdata

services:

    nginx:
        build: ./nginx/
        ports:
            - 80:80
        links:
            - php
        volumes: *services-volume

    php:
        build: ./php/
        expose:
            - 9000
        # Use same way as for nginx if target override not needed.
        volumes:
            - <<: *services-volume
            target: /opt/target-override

नोट: वह सुविधा जो संस्करण 3.4 फ़ाइल प्रारूप से शुरू हो रही है।


यदि * सेवाएँ-वॉल्यूम ऊपर दिए गए मान के लिए केवल एक संकेतक है, तो यह बहुत बढ़िया लगता है ... मुझे इसे आज़माना होगा।
Jimbo


2
नामांकित वॉल्यूम, शीर्ष स्तर के volumesक्षेत्र को उर्फ , अभी भी v3docker-compose में एक चीज लगती है ।
एलेक्स पॉवेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.