2016-08-27 14 views
18

मैं एक Dockerfile जहाँ मैं कंटेनर जो ठीक काम करता है के लिए एक मौजूदा निर्देशिका कॉपी (सामग्री के साथ) है:प्रतिलिपि बनाई जा रही फ़ाइलों लिखें

Dockerfile

FROM php:7.0-apache 
COPY Frontend/ /var/www/html/aw3somevideo/ 
COPY Frontend/ /var/www/html/ 

RUN ls -al /var/www/html 
RUN chown -R www-data:www-data /var/www/html 
RUN chmod -R 755 /var/www/html 

Screenshot of directory listing with docker exec

लेकिन जब मैं docker-compose.yml फ़ाइल का उपयोग करता हूं तो केवल aw3somevideo निर्देशिका है और aw3somevideo के अंदर कुछ भी नहीं है।

डोकर-compose.yml:

php: 
    build: php/ 
    volumes: 
     - ./Frontend/ :/var/www/html/ 
     - ./Frontend/index.php :/var/www/html/ 
    ports: 
     - 8100:80 

Screenshot of empty directory listing

शायद मैं volumes के समारोह समझ में नहीं आता और यदि ऐसा है कृपया मुझे बताओ कैसे कंटेनर के लिए अपने मौजूदा फ़ाइलों की प्रतिलिपि बनाना docker-compose.yml फ़ाइल के माध्यम से।

+1

जिसे एक -1 छोड़ दिया में चला जाता है, तो आप कारण के लिए एक टिप्पणी जोड़ने चाहिए। यह सिर्फ बुनियादी एसओ शिष्टाचार है। – Alkaline

+2

अपने डॉकर-कंपोज़ फ़ाइल से अपने 'वॉल्यूम्स:' सेक्शन को हटाएं। आपकी छवि में पहले से ही डेटा है। वॉल्यूम्स: सेक्शन सिर्फ डेटा को ओवरराइट करता है। वर्तमान डॉकर-रचना प्रारूप (संस्करण 2) पर भी जाएं। – Alkaline

+0

@Alkaline thx कि वास्तव में समस्या थी। लेकिन वॉल्यूम ने पूरी निर्देशिका की प्रतिलिपि क्यों नहीं की? – TheDoctor

उत्तर

15

अपडेट किया गया अप्रैल 2017

व्यवहार बदल गया है के बाद से मैं मूल जवाब में लिखा था। यह अब सुसंगत है कि दाएं हाथ की ओर नामित मात्रा निर्दिष्ट है जैसे myvolume या मेजबान पर पथ जैसे /var/lib/myapp। उदाहरण

volumes: 
     - /dir/on/host:/var/www/html 

अगर /dir/on/host मौजूद नहीं है के लिए, यह मेजबान पर बनाई गई है और खाली सामग्री /var/www/html पर कंटेनर में रखा जाता है। /var/www/html में जो कुछ भी था, वह पहुंच योग्य नहीं था।

---- वर्ष जवाब -----------

अपने डोकर-लिखें सुविधा में volumes: अनुभाग अधिलेखित कर देता है जो कुछ /var/www/html निर्देशिका में है।

दो साधन स्थितियों हैं:

  1. मात्रा मौजूद है

    उस मामले में, मात्रा की सामग्री हावी रहती है जो कुछ डीएसटी निर्देशिका में है।

    उदाहरण के लिए:

    volumes: 
        - /dir/on/host:/var/www/html 
    
  2. मात्रा

    मौजूद नहीं है myvolume मौजूद नहीं है (उदाहरण के लिए एक नामित मात्रा),/var की सामग्री/www/html की प्रतिलिपि बनाई जाएगी मात्रा के लिए पहली बार

    volumes: 
        - myvolume:/var/www/html 
    

मामले 2 में, एक ही मात्रा माउंट करने के लिए अगर आप की कोशिश फिर कुछ कंटेनर पर, यह केस 1 का पालन करेगा।

volumes: 
     - myvolume:/var/www/html 

उस मामले में (यह मानते हुए myvolume पहले से ही बनाया गया था),/var/ww/html की सामग्री जो कुछ myvolume में है द्वारा ओवरराइट किया जाएगा (छाया)।

आधिकारिक दस्तावेज़ अधिक जानकारी के https://docs.docker.com/compose/compose-file/#/volumes-volume-driver

+0

क्या यह संभव है कि हाल के डॉकर संस्करणों के साथ 'var/www/html/'की सामग्री अब'/dir/on/host' पर कॉपी नहीं की गई है, भले ही यह अस्तित्व में न हो? क्या कोई कंटेनर पहली बार डालने पर मेजबान को डॉकर-कंटेनर के भीतर से डेटा को प्रतिलिपि बनाने का कोई तरीका है? – Tarator

+0

@ टैटर हां वास्तव में, सही हाथ की ओर मेजबान को कॉपी नहीं किया गया है। मैं जवाब अपडेट करूंगा। कंटेनर स्टार्ट पर प्रतिलिपि बनाने के तरीके के रूप में, आप स्टार्टअप कमांड को इस 'डॉकर रन-वी/डीआईआर/ऑन/होस्ट:/होस्टडियर php sh -c "cp -rp/var/www/html/* जैसे कुछ के साथ ओवरराइड कर सकते हैं।/hostdir && exec myapp "'। अंतिम आदेश का आह्वान करने के लिए 'exec' का उपयोग करना न भूलें ताकि इसे PID1 असाइन किया जा सके। यह सुनिश्चित करेगा कि मैप को समाप्ति संकेत प्राप्त होगा (उदाहरण के लिए Ctrl-C)। – Alkaline

+0

हाय, मैं डॉकर-कंपोज़ के साथ एक ही चीज़ की कोशिश कर रहा हूं लेकिन एक त्रुटि प्राप्त कर रहा हूं, क्या आप इसे देख सकते हैं ... https: //stackoverflow.com/questions/45573831/docker-compose-not- सक्षम करने के लिए कॉपी-haproxy-cfg .... धन्यवाद – utkarsh31

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