2014-09-30 14 views
5

मैं डॉकर के साथ खेल रहा हूं और उपयोगिता बनाने और नियम लिखने का प्रयास करता हूं जो डॉकरफ़ाइल परिवर्तन पर केवल डॉकर छवि का पुनर्निर्माण करता है।
मेरे परियोजना संरचना लगता है:डॉकर बनाने के साथ: डॉकरफ़ाइल परिवर्तन पर छवि बनाएं

tree . 
. 
├── Dockerfile 
├── Makefile 
└── project 
    └── 1.js 

मेरे Dockerfile बहुत सरल है:

FROM ubuntu 

RUN apt-get update 
RUN apt-get install -y curl 
RUN curl -sL https://deb.nodesource.com/setup | sudo bash - 
RUN apt-get update 
RUN apt-get install -y build-essential nodejs 
VOLUME ["/project"] 
ENTRYPOINT ["cat"] 
CMD ["project/1.js"] 

यह सिर्फ NodeJS स्थापना के साथ सरल ubuntu छवि बनाता है और साझा निर्देशिका से एक स्क्रिप्ट चलाने।

अब मैं मेकफ़ाइल से इस छवि को चलाने के लिए चाहता हूं। जब मैं डॉकरफ़ाइल बदलता हूं तो मैं छवि को पुनर्निर्माण करना चाहता हूं।

default: run 

run: build 
     docker run -v $(CURDIR)/project:/project app-server 

build: Dockerfile 
     docker build -t app-server . 

अब जब मैं sudo make आदेश पर अमल यह एक छवि हर बार पुनर्निर्माण: Makefile तरह दिखता है।

डॉकरफ़ाइल बदलते समय केवल बिल्ड कार्य निष्पादित करने के लिए मैं कैसे मजबूर कर सकता हूं?

+0

पर कुछ दिशा निर्देश पोस्ट किया है –

+0

आप शायद ऐसा करने की जरूरत नहीं है आप वास्तव में https://docs.docker.com/articles/dockerfile_best-practices/ पर एक नजर है चाहिए। 'डॉकर बिल्ड' आंतरिक रूप से इस प्रकार के निर्भरता परिवर्तन को प्रबंधित करता है ताकि मूल रूप से वही प्रभाव हो जिसे आप 'मेक' के साथ प्राप्त करने का प्रयास कर रहे हैं। यदि आपको स्थिति देखने की आवश्यकता नहीं है, तो आप '--quiet' विकल्प का उपयोग'>/dev/null' के साथ कर सकते हैं। – nobar

उत्तर

6

जब आप लिखें:

run: build 
     docker run -v $(CURDIR)/project:/project app-server 

एक makefile मेकअप में उम्मीद है कि कि नुस्खा run के नाम से एक फ़ाइल पैदा करेगा। फिर अगली बार रेसिपी को चलाने की आवश्यकता है या नहीं, यह निर्धारित करने के लिए कि उसकी पूर्व शर्त फाइलों के टाइमस्टैम्प के खिलाफ उस फ़ाइल का टाइमस्टैम्प जांचें।

इसी प्रकार build लक्ष्य के साथ आपके मेकफ़ाइल में है।

build: Dockerfile 
     docker build -t app-server . 

इनमें से कोई भी व्यंजन लक्ष्य के नाम से फ़ाइलें नहीं बनाते हैं। इसका मतलब है कि उस फ़ाइल के टाइमस्टैम्प का उपयोग यह निर्धारित करने के लिए नहीं कर सकता कि उसे नुस्खा को फिर से चलाने की आवश्यकता है या नहीं। इस तरह के मेक को यह मानना ​​है कि इसे नुस्खा को फिर से चलाने की जरूरत है (क्योंकि अन्यथा यह मानना ​​होगा कि नियम कभी नहीं चलाएगा)।

यदि आप make -rRd चलाते हैं तो आप देखेंगे कि क्या सोच रहा है और आपको जो कहा है उसका संकेत देखना चाहिए।

इसलिए, आपकी समस्या का समाधान उन सभी लक्ष्यों में स्टाम्प फ़ाइलों को बनाना है।

बस touch [email protected] (वैकल्पिक रूप से @ के साथ प्रीफ़िक्स किया गया है जो कि डिफ़ॉल्ट रूप से चुने गए आदेशों को प्रतिबिंबित करने के लिए पूर्व निर्धारित है) उन लक्ष्यों में से प्रत्येक के लिए यह आपके लिए काम करने के लिए पर्याप्त होना चाहिए।

कहा जा रहा है यह समझ बनाने सकता है नुस्खा लाइनों के बजाय sudo साथ make चल आप टिकट फ़ाइलों के रूप में अच्छी तरह से रूट के रूप में स्वामित्व के लिए नहीं करना चाहते हैं की यह जरूरत है कि में से प्रत्येक पर sudo डाल करने के लिए।

रिकॉर्ड के लिए जीएनयू मेक मैनुअल में अनुभाग 4.8 Empty Target Files to Record Events के रूप में चर्चा की गई है।

5

आपके "लक्ष्य" defaultrun और build "नकली" लक्ष्य हैं। यह एक अमूर्त अवधारणा है, वास्तविक फ़ाइल नहीं। इस तरह के घुटने के लक्ष्य, एक नुस्खा नहीं होना चाहिए (क्योंकि आप उन्हें नहीं बना सकते हैं)। उन्हें वास्तविक फाइलों, या शायद अन्य नकली लक्ष्यों पर निर्भर होना चाहिए, और इसी तरह, सब कुछ अंततः वास्तविक फाइलों पर निर्भर होना चाहिए।

आपका जाली लक्ष्य ऐसे

.PHONY: default run build 

वास्तविक लक्ष्य के रूप में चिह्नित किया जाना चाहिए, दूसरे हाथ पर, एक नुस्खा होना चाहिए - नुस्खा है कि लक्ष्य है।

तो, पहले वास्तविक लक्ष्य पर, नुस्खा के बिना, अपने घुटनों के लक्ष्य पर निर्भर करते हैं।

फिर असली लक्ष्य व्यंजन हैं।

मैं makefile enforce library dependency ordering

+0

सही और उपयोगी होने पर यह सख्ती से समझ में आता है, केवल प्रश्न के उत्तर देने के लिए, क्योंकि यह ओपी को यह पता लगाने में मदद नहीं करता है कि डॉकर रन लक्ष्यों की "वास्तविक फ़ाइल" पर विचार करने के लिए फ़ाइल कैसे प्राप्त करें। (मुझे लगता है कि, निश्चित रूप से, डॉकर स्वयं ही एक फ़ाइल नहीं बनाता है जिसे सीधे पर निर्भर किया जा सकता है।) –

+0

@EtanReisner हाँ, मैं अकसर सवाल का जवाब नहीं देता, क्योंकि मैं घमंडी सोचता हूं :) एक अलग सवाल का जवाब देना बेहतर है। एटान चार्ज के रूप में Guity! –

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