वॉल्यूम में एकल फ़ाइल कैसे माउंट करें


259

मैं एक php आवेदन करने की कोशिश कर रहा हूँ। Dockerfile में मैं संग्रह डाउनलोड करता हूं, इसे निकालता हूं आदि।

सब कुछ ठीक काम करता है, हालांकि अगर एक नया संस्करण जारी किया जाता है, और मैं dockerfile को अपडेट करता हूं तो मुझे एप्लिकेशन को फिर से इंस्टॉल करना होगा, क्योंकि config.php ओवरराइट हो जाता है।

इसलिए मैंने सोचा कि मैं फ़ाइल को वॉल्यूम के रूप में माउंट कर सकता हूं, जैसे मैं डेटाबेस के साथ करता हूं।

मैंने इसे दो तरीकों से आज़माया, एक वॉल्यूम और एक सीधा रास्ता।

डोकर-लिखें:

version: '2'
services:
  app:
    build: src
    ports:
      - "8080:80"
    depends_on:
      - mysql
    volumes:
      -  app-conf:/var/www/html/upload
      -  app-conf:/var/www/html/config.php
    environment:
      DB_TYPE: mysql
      DB_MANAGER: MysqlManager

  mysql:
    image: mysql:5.6
    container_name: mysql
    volumes:
      - mysqldata:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD:
      MYSQL_DATABASE:
      MYSQL_USER:
      MYSQL_PASSWORD:

volumes:
  mysqldata:
  app-conf:

जो त्रुटि में परिणाम:

और मैंने इसे एक दिए गए पथ के साथ, एक घुड़सवार मात्रा के रूप में आज़माया।

/src/docker/myapp/upload:/var/www/html/upload
/src/docker/myapp/upload:/var/www/html/config.php

हालांकि दोनों तरीके काम नहीं कर रहे हैं। माउंटेड वॉल्यूम के साथ मैं देखता हूं कि अपलोड बन जाता है।

लेकिन फिर असफल हो जाता है

/var/www/html/config.php \\ "\" का कारण निर्देशिका \\ "\" नहीं है

अगर मैं इसके साथ कोशिश करूं

/src/docker/myapp/upload/config.php:/var/www/html/config.php

डॉकर अपलोड फ़ोल्डर बनाता है और फिर एक config.php फ़ोल्डर। फाइल नहीं।

या क्या कॉन्फिग्रेशन को बनाए रखने का एक और तरीका है?


मेरे मामले में, मैं सरल हूं कि कंटेनर / वॉल्यूम बनाने से पहले एक खाली फ़ाइल को "स्पर्श" करें। यदि फ़ाइल मौजूद नहीं थी, तो उसने एक निर्देशिका बनाई।
FreeSoftwareServers

जवाबों:


314

टी एल; डीआर / नोटिस:

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

फ़ाइल वॉल्यूम इस तरह से docker में किया जाता है (निरपेक्ष पथ उदाहरण (env चर का उपयोग कर सकते हैं), और आपको फ़ाइल नाम का उल्लेख करने की आवश्यकता है:

    volumes:
      - /src/docker/myapp/upload:/var/www/html/upload
      - /src/docker/myapp/upload/config.php:/var/www/html/config.php

आप भी कर सकते हैं:

    volumes:
      - ${PWD}/upload:/var/www/html/upload
      - ${PWD}/upload/config.php:/var/www/html/config.php

अगर आप /src/docker/myappफोल्डर से डॉकटर-कंपोज करते हैं


81
जैसे मैंने कहा, अगर मैं /src/docker/myapp/upload/config.php:/var/www/html/config.php Docker अपलोड फ़ोल्डर बनाता है और फिर एक config.php फ़ोल्डर बनाता है। फाइल नहीं।
जकुब जुस्ज़्ज़ाक

9
अपनी पोस्ट में आपने अलग तरह से लिखा। यदि फ़ाइल वहाँ है तो इसे फ़ाइल के रूप में माउंट किया जाना चाहिए।
ब्लैकस्टॉर्क

16
इस काम के लिए मुझे एक निरपेक्ष मार्ग की आपूर्ति करनी थी। पीडब्ल्यूडी का उपयोग करने वाले टिप ने यहां बहुत मदद की, धन्यवाद!
स्टीव स्मिथ

4
मेरे लिए फ़ाइलों के बजाय एक फ़ोल्डर बना रहा है, लेकिन मुझे लगता है कि क्योंकि उस पथ में बाद में फ़ाइल की प्रतिलिपि बनाई गई है, वैसे भी बंधन को स्थगित करने के लिए है?
ईकेल्विन

18
अगर / dorc/docker/myapp/upload/config.php होस्ट डॉक में मौजूद नहीं है, तो फ़ोल्डर बनाएगा ... मैं क्या कर रहा हूं एक स्क्रिप्ट बना रहा हूं जो डॉक चलाने से पहले एक खाली फाइल बनाता है - आदर्श होगा अगर मैं cmd ​​लाइन आर्ग्स के माध्यम से docker को मेरे लिए करने का निर्देश दे सकता हूं।
कर्क राशि

78

मैं एक ऐसे ही मुद्दे से पीड़ित था। मैं अपनी कनफ़िगर फ़ाइल को अपने कंटेनर में आयात करने का प्रयास कर रहा था ताकि मैं छवि को दोबारा बनाए बिना हर बार इसे ठीक कर सकूं।

मेरा मतलब है कि मैंने सोचा था कि नीचे दिए गए आदेश $(pwd)/config.pyडॉकटर होस्ट से /root/app/config.pyएक फाइल के रूप में कंटेनर में जाएंगे ।

docker run -v $(pwd)/config.py:/root/app/config.py my_docker_image

हालाँकि, इसने हमेशा एक डायरेक्टरी बनाई है config.py, जिसका नाम फ़ाइल नहीं है।

सुराग ढूंढते हुए, मुझे इसका कारण पता चला ( यहाँ से )

यदि आप किसी फ़ाइल या निर्देशिका को बांधने-माउंट करने के लिए -v या --volume का उपयोग करते हैं, जो अभी तक डॉकर होस्ट पर मौजूद नहीं है, -v आपके लिए समापन बिंदु बनाएगा। यह हमेशा एक निर्देशिका के रूप में बनाया जाता है

इसलिए, इसे हमेशा एक निर्देशिका के रूप में बनाया जाता है क्योंकि मेरे docker होस्ट के पास नहीं है $(pwd)/config.py

भले ही मैं docker होस्ट में config.py बनाऊँ। $(pwd)/config.pyसिर्फ /root/app/config.pyनिर्यात नहीं /root/app/config.py


16
मैं तो बस एक जोड़ा touch path/to/fileमें Dockerfileइतना है कि जब मैं माउंट यह अभी भी एक फ़ाइल (नहीं एक बनाया dir) होगा
shadi

8
बाईं ओर :पूर्ण पथ होना चाहिए। यह इस तरह से काम करता है
sdkks

इसका touchउत्तर था, डॉकरीफाइल में तब आपका डॉकटर-कंपोज वॉल्यूम माउंट एक डायरेक्टरी
बनाए

27

माउंट ( --mount) के बजाय वॉल्यूम का उपयोग करें ( -v)

अधिक जानकारी: https://docs.docker.com/storage/bind-mounts/

उदाहरण:

सुनिश्चित करें कि dot host पर /tmp/a.txt मौजूद है

docker run -it --mount type=bind,source=/tmp/a.txt,target=/root/a.txt alpine sh

शुक्रिया सुब्बू, @ जकूब जुझज़ाक को यह स्वीकार किया जाना चाहिए, यह एक ही जवाब है जो सवाल का बिल्कुल जवाब देता है, और इसने मेरे लिए काम किया
neokyle

2
यह वास्तव में सवाल का जवाब नहीं देता है। वॉल्यूम भी काम करेगा (क्योंकि समस्या निरपेक्ष पथ में है)। जब वॉल्यूम का होस्ट हिस्सा अभी तक मौजूद नहीं है, तो इसके बीच का अंतर --mountऔर -vव्यवहार है। आपके लिंक के अनुसार:> यदि आप किसी फाइल या निर्देशिका को बांधने-माउंट करने के लिए -v या --volume का उपयोग करते हैं जो अभी तक डॉकर होस्ट पर मौजूद नहीं है, -v आपके लिए समापन बिंदु बनाता है। यह हमेशा एक निर्देशिका के रूप में बनाया जाता है।
द गॉडफादर

2
मैं नहीं जानता कि इसे एक डॉकटर-कम्पोज़ में कैसे तब्दील किया जाए। 'थोड़ी मदद?
एमएसनफोर्ड

@msanford I ने उत्तर में एक डॉकटर-कंपोज़ उदाहरण जोड़ा।
सेबीसोवेन

10

मेरे जैसे विंडोज कंटेनर का उपयोग करने वाले किसी के लिए, पता है कि आप विंडोज़ कंटेनर का उपयोग करके एकल फ़ाइलों को बांध या माउंट नहीं कर सकते।

विंडोज-आधारित कंटेनरों का उपयोग करते समय निम्नलिखित उदाहरण विफल हो जाएंगे, क्योंकि कंटेनर के अंदर वॉल्यूम या बाइंड माउंट का गंतव्य एक में से एक होना चाहिए: एक गैर-मौजूदा या खाली निर्देशिका; या C: के अलावा कोई ड्राइव। इसके अलावा, बाइंड माउंट का स्रोत एक स्थानीय निर्देशिका होना चाहिए, न कि फ़ाइल

net use z: \\remotemachine\share

docker run -v z:\foo:c:\dest ...

docker run -v \\uncpath\to\directory:c:\dest ...

docker run -v c:\foo\somefile.txt:c:\dest ...

docker run -v c:\foo:c: ...

docker run -v c:\foo:c:\existing-directory-with-contents ...

यह मुश्किल है, लेकिन यह वहाँ है

Windows कंटेनर में फ़ाइलों के मानचित्रण के बारे में Github मुद्दे से लिंक करें


9

जिस तरह से मेरे लिए काम किया गया वह एक bindमाउंट का उपयोग करने के लिए है

  version: "3.7"    
  services:
  app:
    image: app:latest
    volumes:
      - type: bind
        source: ./sourceFile.yaml
        target: /location/targetFile.yaml

इस पर उत्तर के लिए धन्यवाद माइक नस्ल: डॉक-कंपोज़ का उपयोग करके वॉल्यूम से एकल फ़ाइल माउंट करें

bindमाउंट को व्यक्त करने के लिए आपको "लंबे वाक्यविन्यास" का उपयोग करने की आवश्यकता है : https://docs.docker.com/compose/compose-file/#long-syntax


7

डॉकटर-कम्पोज़ फ़ाइल संस्करण 3.2 के अनुसार आप "माउंट" (डिफ़ॉल्ट प्रकार "वॉल्यूम" के बजाय) प्रकार की मात्रा माउंट को निर्दिष्ट कर सकते हैं जो आपको कंटेनर में एक फ़ाइल को माउंट करने की अनुमति देता है। डॉक-कंपोज़ वॉल्यूम डॉक्स में "बाइंड माउंट" के लिए खोजें: https://docs.docker.com/compose/compose-file/#volumes

मेरे मामले में, मैं अपने आवेदन में एकल ".secrets" फ़ाइल को माउंट करने की कोशिश कर रहा था जिसमें केवल स्थानीय विकास और परीक्षण के लिए रहस्य थे। उत्पादन में मेरा आवेदन एडब्ल्यूएस के बजाय इन रहस्यों को प्राप्त करता है।

यदि मैंने शॉर्टहैंड सिंटैक्स का उपयोग करके इस फ़ाइल को वॉल्यूम के रूप में माउंट किया है:

volumes:
 - ./.secrets:/data/app/.secrets

डॉकर कंटेनर के बाहर फ़ाइल में मैपिंग करने के बजाय कंटेनर के अंदर एक ".secrets" निर्देशिका बनाएगा । मेरा कोड तब "IsADirectoryError: [Errno 21] एक निर्देशिका है: '.secrets'" जैसी त्रुटि उठाएगा।

इसके बजाय मैंने लंबे-समय के सिंटैक्स का उपयोग करके इसे ठीक किया, मेरे रहस्य फ़ाइल को केवल "बाइंड" वॉल्यूम माउंट का उपयोग करके निर्दिष्ट किया:

volumes:
 - type: bind
   source: ./.secrets
   target: /data/app/.secrets
   read_only: true

अब डॉकर ने मेरी .secrets फ़ाइल को कंटेनर में सही ढंग से mounts किया है, जिससे निर्देशिका के बजाय कंटेनर के अंदर एक फ़ाइल बनाई जा रही है। आशा है कि अन्य लोग इस उदाहरण को उपयोगी पाएंगे!


धन्यवाद महोदय! यही वह उपाय था जो मुझे अपने वर्डप्रेस wp-config.php फ़ाइल को माउंट करने में सक्षम होना चाहिए (और इसे एक निर्देशिका के रूप में बनाया जा रहा है)
जोनो

6

आप docker-compose.ymlइस तरह अपनी फ़ाइल के लिए एक रिश्तेदार पथ का उपयोग कर सकते हैं (विंडोज होस्ट, लिनक्स कंटेनर पर परीक्षण किया गया):

 volumes:
      - ./test.conf:/fluentd/etc/test.conf

1
मैंने मैक पर इसका परीक्षण डॉकटर-कम्पोज़ संस्करण 1.24.1 के साथ फाइल version: '3.7'में निर्दिष्ट किया docker-compose.yml, 4667896b का निर्माण किया, और यह काम किया।
एक्यूमेनस

6
मुझे अभी भी एक फ़ाइल के बजाय एक निर्देशिका मिलती है।
चॉवी

0

मेरे लिए, मुद्दा यह था कि जिस फ़ाइल को मैं कंटेनर में माउंट करने की कोशिश कर रहा था, उस पर मेरा एक टूटा हुआ प्रतीकात्मक लिंक था


0

मैं, विंडोज पर एक ही मुद्दा था Docker 18.06.1-ce-win73 (19507)

डॉकर सेटिंग्स पैनल के माध्यम से साझा ड्राइव को हटाना और फिर से जोड़ना और सब कुछ फिर से काम किया।


0

विंडोज़ में, यदि आपको अपने docker-compose.yml में $ {PWD} env वैरिएबल की आवश्यकता है तो आप उसी निर्देशिका में .env फ़ाइल को अपने docker-compose.yml फ़ाइल के रूप में क्रिएट कर सकते हैं, फिर अपने फ़ोल्डर का स्थान सम्मिलित करें।

CMD (pwd_var.bat):

echo PWD=%cd% >> .env

पॉवर्सशेल (pwd_var.ps1):

$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'; echo "PWD=$(get-location).path" >> .env

Docker-compose .env वेरिएबल्स के लिए और अधिक अच्छे फीचर्स सुनने को मिलते हैं: https://docs.docker.com/compose/reference/envvars/ विशेष रूप से COMPOSE_CONVERT_WINDOWS_PATHSenv वैरिएबल के लिए जो docker कंपोज़ को baskslash के साथ विंडो पथ स्वीकार करने की अनुमति देता है "\"

जब आप किसी फ़ाइल को विंडोज़ पर साझा करना चाहते हैं, तो कंटेनर के साथ साझा करने से पहले फ़ाइल मौजूद होनी चाहिए।



0

शायद यह किसी की मदद करे।

मुझे यह समस्या थी और मैंने सब कुछ आजमाया। वॉल्यूम बाइंडिंग अच्छी तरह से दिखती थी और भले ही मैंने डायरेक्टरी (फाइल्स नहीं) को माउंट किया हो, मेरे पास माउंटेड डायरेक्टरी में फाइल के नाम सही थे लेकिन डायर के रूप में माउंट किए गए थे।

मैंने साझा ड्राइव को फिर से सक्षम करने की कोशिश की और डॉकर ने शिकायत की कि फ़ायरवॉल सक्रिय है।

फ़ायरवॉल को अक्षम करने के बाद सभी ठीक काम कर रहा था।


उसके लिये आपका धन्यवाद! आपकी पोस्ट ने मुझे एहसास दिलाया कि मेरा सेलेनक्स लागू करने के लिए तैयार था और यह मेरी सभी परेशानियों का कारण बन रहा था। पता नहीं क्यों आप नीचे why_ (_) _ / av
ओक्टेवियन

0

आप फ़ाइल या निर्देशिका / फ़ोल्डर माउंट कर सकते हैं यह सब स्रोत फ़ाइल या निर्देशिका पर निर्भर करता है। और आपको पूर्ण पथ प्रदान करने की आवश्यकता है या यदि आप सुनिश्चित नहीं हैं कि आप PWD का उपयोग कर सकते हैं। यहाँ एक सरल कार्य उदाहरण है।

इस उदाहरण में, मैं एनवी-कमांड फाइल को बढ़ा रहा हूं जो पहले से ही मेरी कार्यशील निर्देशिका में मौजूद है

$ docker run  --rm -it -v ${PWD}/env-commands:/env-commands aravindgv/eosdt:1.0.5 /bin/bash -c "cat /env-commands"

-1

मैं अपने विंडोज 8.1 पर एक ही मुद्दा है

यह पता चला कि यह पथ के मामले-संवेदनशीलता के कारण था। मैंने docker-compose upनिर्देशिका से कॉल किया cd /c/users/alex/और कंटेनर के अंदर एक फ़ाइल को निर्देशिका में बदल दिया गया।

लेकिन जब मैंने cd /c/Users/alex/(यूजर्स ने कैपिटल नहीं किया ) और docker-compose upवहां से कॉल किया तो यह काम कर गया।

मेरे सिस्टम में यूजर्स डीआईआर और एलेक्स डीर दोनों को कैपिटल में रखा गया है, हालांकि ऐसा लगता है कि केवल यूजर्स ही डिर मैटर करते हैं।

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