2016-08-04 24 views
5

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

कंटेनर एक:: नोड कंटेनर कि दृश्यपटल का निर्माण करेगा आवेदन प्रतिक्रिया और एक निर्देशिका app/dist/ बुलाया में बंडल जगह लक्ष्य निम्नलिखित जिम्मेदारियों के साथ 2 कंटेनर है। जब यह पूरा हो जाता है, तो कंटेनर चलना बंद कर देगा।

कंटेनर बी: एक अल्पाइन nginx कंटेनर जो /usr/share/nginx/html/app से स्थैतिक फ़ाइलों को सर्वर करेगा।

कंटेनर ए में निर्मित फाइलें कंटेनर बी को एक वॉल्यूम का उपयोग करके प्रदान की जाएंगी जो <Container A>/app/dist से <Container B>/usr/share/nginx/html/app पर माउंट होगी।

कृपया ध्यान दें कि सार्वजनिक सुलभ बंदरगाह और nginx कंटेनर के बीच एक हैप्रोक्सी परत है जो app नामक कंटेनर है।

कार्यों के ऊपर एक डोकर लिखें फ़ाइल जो ऐसा दिखाई देता का उपयोग कर ऑर्केस्ट्रेटेड किया जा रहा है:

version: '2' 
volumes: 
    webapp_build_volume: {} 
services: 
    webapp_build: 
    build: 
     context: . 
     dockerfile: 'config/nginx/dockerfile-builder' 
    volumes: 
     - webapp_build_volume:/app/dist 
     - webapp_static_volume:/app/src/app/static 
    app: 
    build: 
     context: 'config/haproxy' 
     dockerfile: 'dockerfile-app-haproxy' 
    links: 
     - web 
    volumes: 
     - /var/run/docker.sock:/var/run/docker.sock 
    ports: 
     - '80:80' 
     - '1936:1936' 
    web: 
    build: 
     context: . 
     dockerfile: 'config/nginx/dockerfile-web' 
    environment: 
     - EXCLUDE_PORTS=443 
     - VIRTUAL_HOST=* 
    depends_on: 
     - webapp_build 
    volumes: 
     - webapp_build_volume:/usr/share/nginx/html/app 

यह वर्तमान में केवल पहली बार डोकर लिखें फ़ाइल बनाया गया है काम कर रहा है। वॉल्यूम बनने के बाद वॉल्यूम में फ़ाइलें अब अपडेट नहीं होती हैं। मैंने पढ़ा है कि नामित वॉल्यूम्स को स्थापित करने के बाद अपडेट नहीं किया जा सकता है लेकिन मैं इसकी पुष्टि नहीं कर सकता। मुझे चारों ओर काम मिल गया है जिसमें docker-compose rm --force && docker volume webapp_build rm चल रहा है, लेकिन यदि संभव हो तो मैं कैश किए गए कंटेनरों को मारना नहीं चाहता क्योंकि सीआई सेवा बहुत धीमी हो जाएगी।

कृपया मुझे बताएं कि क्या मैं कुछ भी स्पष्ट कर सकता हूं (मुझे समझ में आता है कि यहां बहुत सारे चल रहे हिस्सों हैं)। कृपया ध्यान दें कि मैं डॉकर 2 बीटा का भी उपयोग कर रहा हूं हालांकि मुझे नहीं लगता कि यह मेरे द्वारा किए गए कुछ भी कैसे बदल सकता है।

उत्तर

4

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

सबसे अधिक संभावना है कि आपका भ्रम यह है कि एक कंटेनर बनाने से वॉल्यूम नहीं बढ़ता है, वॉल्यूम केवल कंटेनरों में घुड़सवार होते हैं। नामित वॉल्यूम में एक सुविधा होती है जहां इसे किसी छवि की सामग्री से पॉप्युलेट किया जाएगा, लेकिन केवल तभी जब आप नामित वॉल्यूम को खाली करते हैं। ऐसा प्रतीत होता है कि आप इस सुविधा का पहला निर्माण + रन पर लाभ उठा रहे हैं, लेकिन यह भविष्य के निर्माण पर फिर से काम नहीं करेगा। यदि आप वॉल्यूम के बिना अपना निर्माण कंटेनर चलाते हैं, तो आप पाएंगे कि आपकी फाइलें अपेक्षित हैं।

आप आसानी से नामित वॉल्यूम अपडेट कर सकते हैं। दो विकल्प दिमाग में आते हैं। एक आपकी वर्तमान प्रक्रिया का उपयोग करना है, लेकिन वॉल्यूम माउंट पॉइंट को "/ target" जैसे कुछ और अपने निर्माण कंटेनर के CMD के रूप में बदलें, अपने स्रोत की सामग्री को "/ target" पर कॉपी करें। यही कारण है कि विचार करेंगे की तरह: entrypoint.sh

Dockerfile

... 
RUN compile-cmd --output-to /local/build/dir 

:

cp -a /local/build/dir/* /target/ 

डोकर-लिखें।YML:

version: '2' 
services: 
    webapp_build: 
    build: 
     context: . 
     dockerfile: 'config/nginx/dockerfile-builder' 
    volumes: 
     - webapp_build_volume:/target 
... 

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

entrypoint.sh:

compile-cmd --input-src=/source --output-to /target 

डोकर-compose.yml:

version: '2' 
services: 
    webapp_build: 
    volumes: 
     - app/source:/source 
     - webapp_build_volume:/target 
... 
+0

समाधान 1 कोशिश कर रहा है अब। आपको जल्द ही बताएगा! – Shawn

+0

धन्यवाद। आपका पहला समाधान वहां काम करता था। यह वॉल्यूम को अपडेट करने का कारण क्यों बनाता है लेकिन निर्देशिका में निर्माण नहीं किया गया था? – Shawn

+3

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

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