2016-07-18 25 views
7

अपडेट नहीं किया गया है मैं इस बात पर उलझन में हूं कि नामित डेटा-वॉल्यूम (डेटा कंटेनर नहीं) का उपयोग कैसे किया जाना चाहिए।डॉकर नामित वॉल्यूम

मेरे पास नामित डेटा वॉल्यूम app_src है जिसे डॉकर कंपोज़ फ़ाइल का उपयोग करके /usr/src/app पर रखा गया है। हालांकि, मेरे स्रोत कोड (स्थानीय रूप से) में परिवर्तन करने के बाद, छवि का निर्माण वॉल्यूम को अपडेट नहीं करता है।

मैं बहुत की तरह छवि का निर्माण कर रहा हूँ,

docker-compose -f development.yml build और यह docker-compose -f development.yml up -d चल रहा है।

यह पुष्टि करने के लिए कि वॉल्यूम नहीं बदलेगा, मैं चलने वाले कंटेनर में संलग्न हूं और पर्याप्त सत्य है, स्रोत कोड अपडेट नहीं किया गया है।

मेरी web सेवा के लिए यहां मेरी डॉकर फ़ाइल development.yml और Dockerfile है। संस्करण: '2'

services: 
    web: 
    restart: always 
    build: ./web 
    expose: 
     - "8000" 
    volumes: 
     - app_src:/usr/src/app 
    links: 
     - postgres:postgres 
    env_file: development.env 
    command: ./start_web.sh 

volumes: 
    app_src: {} 


FROM python:3.4.4 

WORKDIR /usr/src/app 
RUN rm -rf /usr/src/app/* 
COPY . /usr/src/app/ 
RUN pip install --no-cache-dir -r requirements.txt 

मैं यह इतना की तरह मेजबान बढ़ते द्वारा काम कर सकता है,

volumes: 
    - ./web/src:/usr/src/app 

मैं डोकर 1.11.2 चल उबंटू 16.04 पर हूँ। क्या मेरी समझ गलत है? मैंने प्रलेखन पर एक नज़र डाली लेकिन मुझे कुछ भी मिल गया जो वॉल्यूम को वास्तव में अच्छी तरह से समझाता था।

उत्तर

7

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

docker run -v app_src:/target -v `pwd`/web/src:/source --rm \ 
    busybox /bin/sh -c "tar -cC /source . | tar -xC /target" 

आप अपने नामित मात्रा अद्यतन करने के लिए मांग पर कि कंटेनर चला सकते हैं:

आप अपने नामित मात्रा को अपडेट करना चाहते हैं, तो एक पक्ष कंटेनर पर विचार करें। यदि आप किसी बड़े भंडार में छोटे बदलाव कर रहे हैं, तो आप स्रोत भंडार से खींचने के लिए git clone जैसे किसी भी प्रकार के साथ टैर को प्रतिस्थापित कर सकते हैं, या यहां तक ​​कि एक rsync (जिसे आप अपनी छवि पर स्थापित करना चाहते हैं)।

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

+0

ठीक है, यह समझ में आता है। मैं थोड़ा उलझन में था कि यह रचना के साथ कैसे बनता है। सेवा लाने के दौरान नामित वॉल्यूम को डॉकर-कंपोज़ से खाली करने का कोई तरीका है? 'डॉकर-कंपोज़ अप' -> मैं वॉल डीआईआर को साफ़ करना चाहता हूं और मेजबान से नवीनतम फाइल कॉपी करना चाहता हूं? –

+0

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

+0

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

1

आप वॉल्यूम को कई बार एक ही स्थान पर आरोहित करते हैं। पहली बार कंटेनर होस्ट फ़ाइल सिस्टम में डेटा स्टोर करता है, दूसरी बार यह आपके होस्ट फ़ाइल सिस्टम से कंटेनर में डेटा ओवरराइड करता है। निकालें मात्रा आप से माउंट डोकर-लिखें फ़ाइल

volumes: - ./web/src:/usr/src/app #remove this!

आप अतिरिक्त जानकारी here

$ docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

प्राप्त कर सकते हैं

यह आदेश मेजबान निर्देशिका,/src/webapp mounts, में कंटेनर/ऑप्ट/वेबएप पर। यदि कंटेनर की छवि के अंदर पथ/ऑप्ट/वेबैप पहले से मौजूद है, तो/src/webapp माउंट ओवरले करता है लेकिन पूर्व-मौजूदा सामग्री को नहीं हटाता है। एक बार माउंट हटा दिए जाने के बाद, सामग्री फिर से सुलभ हो जाती है। यह माउंट कमांड के अपेक्षित व्यवहार के अनुरूप है।

+0

मैंने वॉल्यूम को कई बार माउंट नहीं किया था। मैं मेजबान फ़ाइल सिस्टम को वॉल्यूम में घुमाने के द्वारा इसे काम करने के लिए बना सकता हूं। मुझे लगता है कि मैं समझ रहा हूं कि क्या हो रहा है, निर्माण पर, मेजबान से सामग्री छवि पर कॉपी की गई है। लेकिन फिर, मैं उस वॉल्यूम को आरोहित कर रहा हूं जिसमें मौजूदा डेटा है, ताकि वह उस छवि को छाया दे सके जो छवि पर कॉपी की गई है। यह सामान्य 'माउंट' की तरह काम करता है। मुझे लगता है कि मुझे क्या उलझन में था कि मैंने सोचा था कि छवि निर्माण से पहले 'माउंट' किया जाता है, जो गलत है। –

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