2015-08-15 5 views
26

के साथ डॉकर में डैंजो विकास के साथ कोड परिवर्तनों का ऑटो-रीलोडिंग मैं Django विकास के लिए एक डॉकर कंटेनर का उपयोग कर रहा हूं, और कंटेनर गिनिकोर्न को निजिनक्स के साथ चलाता है। मैं ऑटो लोड में कोड परिवर्तन चाहता हूं, लेकिन एकमात्र तरीका जिसे मैं उन्हें लोड करने के लिए प्राप्त कर सकता हूं वह डॉकर-कंपोज़ (docker-compose build) के साथ पुनर्निर्माण कर रहा है। "बिल्ड" के साथ समस्या यह है कि यह मेरे सभी पाइप इंस्टॉल को फिर से चलाता है।गनिकोर्न

मैं गनिकोर्न --reload ध्वज का उपयोग कर रहा हूं, जो जाहिर है जो मैं चाहता हूं वह करना है। यहाँ मेरी डोकर config फ़ाइलें हैं:

## Dockerfile: 
FROM python:3.4.3 
RUN mkdir /code 
WORKDIR /code 
ADD . /code/ 
RUN pip install -r /code/requirements/docker.txt 

## docker-compose.yml: 
web: 
    restart: always 
    build: . 
    expose: 
    - "8000" 
    links: 
    - postgres:postgres 
    volumes: 
    - /usr/src/app/static 
    env_file: .env 
    command: /usr/local/bin/gunicorn myapp.wsgi:application -w 2 -b :8000 --reload 

nginx: 
    restart: always 
    build: ./config/nginx 
    ports: 
    - "80:80" 
    volumes: 
    - /www/static 
    volumes_from: 
    - web 
    links: 
    - web:web 

postgres: 
    restart: always 
    image: postgres:latest 
    volumes: 
    - /var/lib/postgresql 
    ports: 
    - "5432:5432" 

मैं अन्य डोकर आदेश (docker-compose restart, docker-compose up) में से कुछ की कोशिश की है, लेकिन कोड को ताज़ा नहीं होंगे।

मुझे क्या याद आ रही है?

+0

क्या आपने अपने कोड के साथ वॉल्यूम साझा किया है? परिदृश्य देखने के लिए क्या आप अपने डॉकर-compose.yml का हिस्सा पोस्ट कर सकते हैं? – kikicarbonell

+0

मुझे आपकी "समस्या" निर्माण के साथ समस्या नहीं है, यह है कि यह मेरे सभी पाइप इंस्टॉल को फिर से चलाता है। "शायद आप पहले सभी पाइप इंस्टॉल कर सकते हैं, ताकि 'डॉकर बिल्ड' केवल कोड परिवर्तन लोड कर सके। क्या आप अपना डॉकफाइल दिखा सकते हैं? आपके पास 'MyPipinstalls' से शुरू होने वाला डॉकरफ़ाइल भी हो सकता है – user2915097

+0

किकिकार्बोनेल, आपके प्रश्न ने मुझे एहसास दिलाया कि मुझे अपने कोड के लिए वॉल्यूम चाहिए, और ऐसा लगता है कि मेरे मुद्दे को ठीक किया गया है, इसलिए मुझे समाधान के लिए धन्यवाद! –

उत्तर

21

धन्यवाद kikicarbonell लिए, मैं अपने कोड के लिए एक मात्रा होने में देखा, और Docker Compose recommended Django setup देखने के बाद, मैं डोकर-compose.yml में अपने वेब कंटेनर के लिए volumes: - .:/code जोड़ा है, और अब किसी भी कोड में परिवर्तन मैं स्वचालित रूप से लागू है।

## docker-compose.yml: 
web: 
    restart: always 
    build: . 
    expose: 
    - "8000" 
    links: 
    - postgres:postgres 
    volumes: 
    - /usr/src/app/static 
    - .:/code 
    env_file: .env 
    command: /usr/local/bin/gunicorn myapp.wsgi:application -w 2 -b :8000 --reload 

अद्यतन: डोकर साथ Gunicorn और Django का उपयोग कर के एक संपूर्ण उदाहरण के लिए, इस example project from Rackspace चेकआउट, जो भी पता चलता डोकर-मशीन का उपयोग करने के लिए कैसे रैकस्पेस बादल की तरह रिमोट सर्वर पर सेटअप शुरू करने के लिए।

चेतावनी: वर्तमान में, यह कोड तब काम नहीं करता है जब आपका कोड स्थानीय रूप से होता है और डॉकर होस्ट दूरस्थ होता है (उदाहरण के लिए, क्लाउड प्रदाता जैसे डिजिटल महासागर या रैक स्पेस पर)। यह वर्चुअल मशीनों पर भी लागू होता है यदि आपकी स्थानीय फाइल सिस्टम वीएम पर नहीं है। ध्यान दें कि अलग-अलग वॉल्यूम ड्राइवर (उदा।, झुकाव) हैं, और वहां इस आवश्यकता को हल करने के लिए कुछ बाहर हो सकता है। अभी के लिए, "फिक्स" रिमोट डॉकर होस्ट पर निर्देशिका में अपनी फ़ाइलों को rsync/scp करना है। फिर, --reload ध्वज किसी भी scp/rsync के बाद स्वत: पुनः लोड करने के लिए बंदूक जाएगा। अद्यतन: यदि डॉकर होस्ट को हटाने के लिए कोड को धक्का दे रहा है, तो मुझे डॉकर कंटेनर को पुनर्निर्माण करना बहुत आसान लगता है (उदाहरण के लिए, docker-compose build web && docker-compose up -d)। यदि आपका src फ़ोल्डर बड़ा है तो यह rsync दृष्टिकोण की तुलना में धीमा हो सकता है।

+0

मैंने सोचा कि inotify डॉकर वॉल्यूम के साथ काम नहीं किया था। https://github.com/docker/docker/issues/18246 कोई विचार यह क्यों काम करता है? –

+1

@EricIhli - यह विधि काम नहीं करती है जब डॉकर होस्ट दूरस्थ है (क्योंकि कंपोज़ फ़ाइल में वॉल्यूम घोषणा डॉकर होस्ट के संबंध में होती है)। मैंने अपने उत्तर को एक स्पष्टीकरण के साथ एक स्पष्टीकरण के साथ अद्यतन किया है। –

+1

आह। धन्यवाद। मैंने फ़ाइल परिवर्तनों को देखने की आवश्यकता की अपनी समस्या का समाधान किया और मैक पर 'fswatch' का उपयोग करके, 'xargs' के माध्यम से पाइप करके 'डॉकर निष्पादन ' चलाकर किसी कंटेनर के अंदर कुछ कार्रवाई की, अगर कोई और ढूंढ रहा है उस। –

14

आपको एक और समस्या है- डॉकर प्रत्येक परत को बनाता है जो इसे बनाता है। आपको हर बार पाइप इंस्टॉल को फिर से चलाने की ज़रूरत नहीं है!

ADD . /code/ 
RUN pip install -r /code/requirements/docker.txt 

यह आपके समस्या डोकर हर बयान जोड़ देते हैं तो किसी भी फाइल को बदल दिया है देखने के लिए जाँच करता है और यह और हर बाद में कदम अगर यह है के लिए कैश को अमान्य कर रहा है। ऐसा करने का सही तरीका है ...

ADD ./requirements/docker.txt /code/requirements/ 
RUN pip install -r /code/requirements/docker.txt 
ADD ./code/ 

यदि आपकी आवश्यकताएं फ़ाइल बदलती हैं तो केवल आपकी पीआईपी इंस्टॉल लाइन को अमान्य कर देगा!

+0

मैं सोच रहा था कि एडीडी अनावश्यक क्यों था। मुझे बताने के लिए धन्यवाद –

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