Docker Compose संस्करण 2 "वॉल्यूम" सिंटैक्स को कैसे देखना चाहिए?


43

साथ डोकर लिखें v1.6.0 +, अब के लिए एक नया / संस्करण 2 फ़ाइल वाक्य रचना है docker-compose.ymlफ़ाइल। परिवर्तनों में नाम की एक अलग शीर्ष स्तरीय कुंजी शामिल है volumes। यह एक ही स्थान पर वॉल्यूम परिभाषाओं को "केंद्रीकृत" करने की अनुमति देता है।

मैं जो करने की कोशिश कर रहा हूं , उसमें वॉल्यूम का नाम है और मेरे स्थानीय होस्ट डिस्क पर एक एकल वॉल्यूम संदर्भ एकाधिक पथ है। निम्नलिखित एक उदाहरण है, इसके साथ एक अपवाद को फेंकना Tracebackसमाप्त होता है

AttributeError: 'list' object has no attribute 'items'

उदाहरण docker-compose.yml:

version: '2'

services:
  db:
    image: postgres
    volumes:
      - database:/var/lib/postgres/data

  php:
    image: php-fpm:5.6
    volumes:
      - phpconf:/etc/php/conf.d

  namedvolume:
    container_name: namedvolume
    build: ./Docker/Testvolume
    volumes: 
      - ./Docker/Testvolume/shareme

volumes:
  database:
    - ./Docker/Postgres/db:ro
    - ./Docker/Postgres/ini
  phpconf:
    - ./Docker/PHP-FPM/conf
  singledir: ./Docker/foo
  completemap: ./Docker/bar:/etc/service/conf.d
  - namedvolume:/etc/service/conf.d # < this was a separate attempt w/o the other keys
  … ?

अब तक मैंने सभी डॉकर masterकम्पोज़ डॉक्स -ब्रंच वॉल्यूम कॉन्फ़िगरेशन संदर्भ के माध्यम से पढ़ा , डॉकर कंपोज़ डॉक्स वॉल्यूम / वॉल्यूम-ड्राइवर संदर्भ और अपेक्षित सिंटैक्स को खोजने के लिए गिटहब उदाहरणों के माध्यम से देखा । ऐसा लगता है कि कोई भी पहले से ही (GitHub) का उपयोग नहीं कर रहा है और प्रलेखन पूरा होने से बहुत दूर है (docker.com)। मैंने भी एक अलग वॉल्यूम बनाने की कोशिश की serviceऔर इसे संदर्भित किया volumes, लेकिन यह भी काम नहीं करता है। इस वाक्यविन्यास पर कोई विचार कैसे दिखना चाहिए?

जवाबों:


40

volumesकुंजी का उद्देश्य

यह नामांकित वॉल्यूम बनाने के लिए है ।

यदि आप इसका उपयोग नहीं करते हैं, तो आप अपने संस्करणों के लिए अपने आप को हैशेड मूल्यों के एक समूह के साथ पाएंगे। उदाहरण:

$ docker volume ls 
DRIVER              VOLUME NAME
local               f004b95d8a3ae11e9b871074e9415e24d536742abfe86b32ffc867f7b7063e55
local               9a148e167e1c722cbdb67c8edc36f02f39caeb2d276e9316e64de36e7bc2c35d

नामित संस्करणों के साथ, आपको निम्न जैसा कुछ मिलता है:

$ docker volume ls
local               projectname_someconf
local               projectname_otherconf

नामांकित वॉल्यूम कैसे बनाएं

docker-compose.ymlवाक्य रचना है:

version: '2'

services:
    app:
        container_name: app
        volumes_from:
            - appconf
    appconf:
        container_name: appconf
        volumes:
            - ./Docker/AppConf:/var/www/conf

volumes:
    appconf:

networks:
    front:
        driver: bridge

यह ऊपर की तरह कुछ नामांकित संस्करणों को दिखाया गया है।

थोक में वॉल्यूम कैसे निकालें

जब आपके पास हैश का गुच्छा होता है, तो इसे साफ करना काफी कठिन हो सकता है। यहाँ एक लाइनर है:

docker volume rm $(docker volume ls |awk '{print $2}')

संपादित करें: जैसा कि @ArthurTacca ने टिप्पणियों में बताया, याद रखने का एक आसान तरीका है:

docker volume rm $(docker volume ls -q)

नामित वॉल्यूम के बारे में विवरण कैसे प्राप्त करें

अब जब आपको हैश नहीं देखना है, तो आप इस पर जा सकते हैं और उन्हें उनके नाम से पुकार सकते हैं  :

docker volume inspect <volume_name>

# Example:
$ docker volume inspect projectname_appconf

[
    {
        "Name": "projectname_appconf",
        "Driver": "local",
        "Mountpoint": "/mnt/sda1/var/lib/docker/volumes/projectname_appconf/_data"
    }
]

सिडेनोट: आप docker-compose downवॉल्यूम बनाने से पहले अपनी सेवाओं को नए सिरे से शुरू करना चाहते हैं ।

अगर आप Boot2Docker / Docker Machine का उपयोग कर रहे हैं , तो आपको उस वॉल्यूम को करने से पहले docker-machine sshऔर बाद में - आप की मेजबानी की जाने वाली मशीन है, जिसे VM ने Docker Machine द्वारा प्रावधानित किया है ।sudo -ils -la /mnt/…


1
बहुत अच्छा जवाब। खुश होती है। नए डॉकटर-कंपोज वॉल्यूम खोजने के लिए बहुत कुछ वापस आ रहा है।
डेरेक अडेयर

आपने ये कहां पाया? डॉकर डॉक्स की तुलना में बहुत अधिक लगता है?
डेरेक अडेयर

1
@DerekAdair धन्यवाद, लेकिन जैसा कि आप ऊपरी बाईं ओर के आंकड़ों में पढ़ सकते हैं, इस उत्तर को इस विषय पर Google खोज इंजन परिणाम पृष्ठों में अच्छी तरह से संदर्भित किया गया है।
कैसर

1
इसके बजाय $(docker volume ls |awk '{print $2}')आप उपयोग कर सकते हैं $(docker volume ls -q)न केवल यह सरल है, यह पहली पंक्ति में "वोल्यूम" को प्रिंट नहीं करता है।
आर्थर टाका

2
यह सही नहीं है; यह ऐसा नहीं करता है जिससे यह ऐसा लगता है जैसे यह करता है। अन्य कंटेनर से वॉल्यूम की सूची volumes_fromको इनहेरिट करना है। नामित वॉल्यूम का उपयोग करने के लिए, आप सेवा-स्तर के सिंटैक्स का उपयोग करते हैं - NAME:DEST, और शीर्ष स्तर की volumesकुंजी में पथ सेट करते हैं । यह उदाहरण क्या करता है (यह लिखने के समय) एक नामित मात्रा के अलावा एक मानक मात्रा बनाता है , और नामित मात्रा का उपयोग नहीं किया जाता है।
trevorj

13

जिस तरह से मैं इसे समझता हूं, आप वैश्विक volumes:अनुभाग का उपयोग कर सकते हैं

  • एक वॉल्यूम नाम परिभाषित करें
  • किसी भिन्न वॉल्यूम नाम के तहत नामांकित वॉल्यूम उपलब्ध कराएं
  • नामित वॉल्यूम के लिए ड्राइवर और ड्राइवर विकल्प निर्दिष्ट करें

जब तक आप निर्दिष्ट नहीं करेंगे तब तक वैश्विक खंड में वॉल्यूम स्वतः-निर्मित होंगे external: true। आपको तब भी प्रत्येक सेवा को उसके volumes:खंड में बताना होगा जहां उस वॉल्यूम को माउंट करना है।

यहाँ एक बहुत ही सरल उदाहरण दिया गया है:

version: '2'
volumes:
  project:
services:
  one:
    volumes:
      - project:/bar
  two:
    volumes:
      - project:/foo

वैश्विक volumes:प्रविष्टि के लिए projectनामांकित वॉल्यूम बनाने projectका कारण होगा । यह तब /barसर्विस वन के रूप /fooमें और सर्विस टू में माउंट हो जाता है । दोनों सेवाएं वॉल्यूम के डेटा को साझा करती हैं और इसे पढ़ / लिख सकती हैं।

मुझे नहीं लगता कि आप जो करने की कोशिश कर रहे हैं वह संभव है (एक पथ में कई रास्तों को मोड़कर, और विभिन्न आर / डब्ल्यू झंडे के साथ)। यदि यह संभव है, तो संभवत: किसी अन्य माध्यम से इन गुणों के साथ नामांकित वॉल्यूम बनाने का तरीका ढूंढकर और फिर इसे एक बाहरी संस्करण के रूप में जोड़ा जा सकता है:

volumes:
  mymagicvolume:
    external: true

1
पहले से ही अप-डाउन किया गया था, लेकिन आज के समय को इसके चारों ओर जाने का समय मिला और एक विस्तारित डेटा जोड़ा गया। आपकी सभी मदद का धन्यवाद! प्रश्न: जैसा कि आप वॉल्यूम का नाम देते हैं projectऔर फिर इसका संदर्भ देते हैं project:/bar, projectवास्तव में रास्ते कहाँ परिभाषित किए गए हैं?
kaiser

डॉकटर
कंपोज

क्षमा करें, अभी भी समझ में नहीं आता है कि डॉकटर को project:उपनाम के लिए एक रास्ता कहां से मिलता है ? अगर मैं बांटना चाहता हूं तो मुझे कैसे पता चलेगा कि कंटेनर और कंटेनर को क्या कहना ./some_folder/some_subfolder/yet_another_subfolderहै ? one:two:
अलेक्जेंडर लोमिया

उस मामले में यह "प्रोजेक्ट: <जोइनपाथ>" शीर्ष स्तर के संस्करणों के तहत है: खंड
बालिंट बाको

5

की जाँच करें संस्करण 2 उदाहरण के लिए, यह भी खंड विन्यास संदर्भ :

मेरा उदाहरण: (संस्करण 1)

$ tail -4 docker-compose.yml 
  volumes:
    - ./etc/nginx/conf.d:/etc/nginx/conf.d:ro
    - ./var/log/nginx:/var/log/nginx:rw
    - ./var/www/html:/var/www/html:rw
$ 

1
यह वही है जो मैंने प्रश्न में जोड़ा है और इसलिए मेरे प्रश्न का उत्तर नहीं देता है। क्या आप इस बात का उदाहरण पोस्ट करना चाहेंगे कि होस्ट से अलग-अलग निर्देशिकाओं को एक नामित वॉल्यूम के रूप में कई सेवाओं में कैसे मैप करें?
kaiser

मेरी कड़ी है अलग है, यह की ओर इशारा करता Version 2दस्तावेज़ के अनुभाग)
Alexus

मेरी गलती। मैं बस उस एक को जोड़ना भूल गया। जब आप प्रश्न में YML सामान को देखते हैं, तो आप देख सकते हैं कि मैंने स्पष्ट रूप से अलग शीर्ष स्तर की volumesकुंजी का उपयोग करने की कोशिश की है - जो मैंने नहीं किया, इसलिए प्रश्न। मुझे जो नहीं मिलता है वह यह है कि docker-compose.ymlसंस्करण 1 सिंटैक्स वाला भाग मुझे समझाने के लिए है।
kaiser

5

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

नामांकित संस्करणों को माउंट करने का प्रस्ताव किया गया है , लेकिन दुर्भाग्य से निकट भविष्य में इसे कोर में नहीं जोड़ा जाएगा। हालाँकि, यह स्थानीय- persist नाम के docker प्लगइन का उपयोग करके संभव है ।


3
1.11 या 1.12 के बाद से नाम की मात्रा बढ़ाना अब एक बात है ...
कैसर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.