डॉक पाइपर आवश्यकताओं को कैसे चलाएं। केवल तभी यदि कोई परिवर्तन हो?


98

Dockerfile में मेरे पास एक परत है जो संस्थापित करता है requirements.txt:

FROM python:2.7
RUN pip install -r requirements.txt

जब मैं डॉक चित्र बनाता हूँ तो यह इस फाइल में किए गए किसी भी बदलाव की परवाह किए बिना पूरी प्रक्रिया को चलाता है ।

pip install -r requirements.txtयदि फ़ाइल में कोई परिवर्तन हुआ है तो मैं यह कैसे सुनिश्चित कर सकता हूं कि डोकर केवल तभी चलता है ?

Removing intermediate container f98c845d0f05
Step 3 : RUN pip install -r requirements.txt
 ---> Running in 8ceb63abaef6
Collecting https://github.com/tomchristie/django-rest-framework/archive/master.zip (from -r requirements.txt (line 30))
  Downloading https://github.com/tomchristie/django-rest-framework/archive/master.zip
Collecting Django==1.8.7 (from -r requirements.txt (line 1))

1
कृपया docker build(और आपके Dockerfile) का आउटपुट पोस्ट करें । संभवतः, यह आपकी बिल्ड प्रक्रिया का एक पुराना चरण है, जो कैश को ख़त्म कर रहा है, जिससे यह कदम चल सकता है।
थॉमस ओरोज़्को

इस समय मेरे पास मौजूद सभी ओपी को अपडेट करें
प्रोमेथियस

1
बस यह कदम उपयोगी नहीं है। कृपया पूरा आउटपुट (या कम से कम डॉकरीफ़ाइल) पोस्ट करें ।
थॉमस ओरोज़को

जवाबों:


179

मैं मान रहा हूं कि आपकी निर्माण प्रक्रिया में कुछ बिंदु पर, आप अपने पूरे आवेदन को डॉकटर छवि में COPYया उसके साथ कॉपी कर रहे हैं ADD:

COPY . /opt/app
WORKDIR /opt/app
RUN pip install -r requirements.txt

समस्या यह है कि आप हर बार डॉकटर बिल्ड कैश को अमान्य कर रहे हैं, जब आप संपूर्ण एप्लिकेशन को छवि में कॉपी कर रहे हैं। यह बाद के सभी बिल्ड चरणों के लिए कैश को भी अमान्य कर देगा।

इसे रोकने के लिए, मैं संपूर्णrequirements.txt फ़ाइल को छवि में शामिल करने से पहले केवल फ़ाइल को एक अलग बिल्ड चरण में कॉपी करने का सुझाव दूंगा :

COPY requirements.txt /opt/app/requirements.txt
WORKDIR /opt/app
RUN pip install -r requirements.txt
COPY . /opt/app
# continue as before...

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


8
एक सामान्य दिशानिर्देश के रूप में, मेरा मानना COPYहै कि ADDजब तक आपको विशेष रूप से व्यवहार की आवश्यकता नहीं है, तब तक इसे प्राथमिकता दी जाती है ADD
महानगर

2
@ मेट्रोपोलिस, आप पूरी तरह से सही हैं। संकेत के लिए धन्यवाद।
हेल्बर्ट

5
@Metropolis से सहमत हैं। ADDकेवल तभी आवश्यक है जब <src>फ़ोल्डर में कोई संग्रह हो, जिसे अनपैक करने की आवश्यकता हो या दूरस्थ URL हैंडलिंग का समर्थन करने की आवश्यकता हो। {स्रोत कोड}
मोहसिन

45

इसका उल्लेख सीधे तौर पर डॉकर की " डॉकरफाइल्स लिखने की सर्वोत्तम प्रथाओं " में किया गया है:

यदि आपके पास एक से अधिक Dockerfile चरण हैं जो आपके संदर्भ से अलग-अलग फ़ाइलों का उपयोग करते हैं, तो उन्हें व्यक्तिगत रूप से कॉपी करें, बजाय एक बार में। यह सुनिश्चित करेगा कि प्रत्येक चरण का निर्माण कैश केवल अमान्य है (यदि चरण को फिर से चलाने के लिए मजबूर किया जाता है) यदि विशेष रूप से आवश्यक फाइलें बदल जाती हैं।

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

COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/

यदि आप COPY लगाते हैं, तो RUN चरण के लिए कम कैश अमान्य परिणाम हैं। / tmp / इससे पहले।


0

वैकल्पिक रूप से एक तेज के रूप में पुस्तकालयों की स्थापना की पुष्टि करने के लिए "हां" टाइप किए बिना आवश्यकताओं को चलाने के लिए फ़ाइल का मतलब है, आप फिर से लिख सकते हैं:

COPY requirements.txt ./
RUN pip install -y -r requirements.txt
COPY ./"dir"/* .
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.