2015-10-24 8 views
21

मैं गीथब पर Linkurious प्रोजेक्ट के लिए एक डॉकर छवि बनाना चाहता हूं, जिसके लिए नियो 4 जे डेटाबेस और Node.js दोनों को चलाने की आवश्यकता है।एकाधिक FROMS - इसका अर्थ क्या है

मेरा पहला दृष्टिकोण मेरी छवि के लिए आधार छवि घोषित करना था, जिसमें Neo4j शामिल था। संदर्भ डॉक्स किसी भी उपयोगी ढंग से "आधार छवि" को परिभाषित नहीं है:

बेस छवि: एक छवि कोई माता पिता है कि एक आधार छवि

जहाँ से मैंने पढ़ा है मैं केवल हो सकता है एक मूल छवि अगर उस छवि के पास कोई मूल छवि नहीं है।

लेकिन मूल छवि क्या है? क्या इसका मतलब यह है कि अगर मैं निर्देश से neo4j/neo4j घोषित करता हूं, कि जब मेरी छवि चलती है तो नव डेटाबेस स्वचालित रूप से चलाया जाएगा और पोर्ट 7474 पर कंटेनर के भीतर उपलब्ध होगा?

डोकर संदर्भ पढ़ने (देखें: https://docs.docker.com/reference/builder/#from) मैं देख रहा हूँ:

से एकाधिक चित्र बनाने के लिए में एक भी Dockerfile के अंतर्गत कई बार दिखाई दे सकता है। बस प्रत्येक नए FROM कमांड से पहले प्रतिबद्ध द्वारा अंतिम छवि आईडी आउटपुट का नोट बनाएं।

क्या मैं कई छवियां बनाना चाहता हूं? ऐसा लगता है कि मैं चाहता हूं कि एक ऐसी छवि हो जिसमें अन्य छवियों की सामग्री शामिल हो। neo4j और node.js

मुझे संदर्भ मैनुअल में निर्भरताओं की घोषणा करने का कोई निर्देश नहीं मिला है। क्या आरपीएम में कोई निर्भरता नहीं है जहां मेरी छवि को चलाने के लिए कॉलिंग संदर्भ को पहले आवश्यक छवियों को स्थापित करना होगा?

मैं उलझन में हूँ ...

+0

नोट: 2017 मई , अब आपके पास 'डॉकरफ़ाइल' में एकाधिक 'FROM' है। नीचे मेरा संपादित उत्तर देखें। – VonC

उत्तर

27

एक आधार छवि क्या है?

फ़ाइल का एक सेट, के साथ साथ EXPOSE 'घ बंदरगाहों, ENTRYPOINT और CMD
आप FROM निर्देश से शुरू होने वाले नए Dockerfile के साथ उस मूल छवि के आधार पर फ़ाइलों को जोड़ सकते हैं और एक नई छवि बना सकते हैं: FROM के बाद उल्लिखित छवि आपकी नई छवि के लिए "मूल छवि" है।

इसका मतलब यह है कि अगर मैं एक FROM निर्देश में neo4j/neo4j का ऐलान करते हैं कि जब मेरी छवि चलाया जाता है नव डेटाबेस स्वचालित रूप से चलाने के लिए और बंदरगाह 7474 पर कंटेनर के भीतर उपलब्ध हो जाएगा?

सिर्फ अगर आप CMD और ENTRYPOINT के ऊपर लिख नहीं है।
लेकिन छवि स्वयं ही पर्याप्त है: यदि आप neo4j के अपने विशेष उपयोग के लिए neo4j से संबंधित फ़ाइलों को जोड़ना चाहते हैं तो आप FROM neo4j/neo4j का उपयोग करेंगे।

FROM एक भी Dockerfile के अंतर्गत कई बार दिखाई दे सकता है

मत: वहाँ दूर करने के लिए है कि "सुविधा" वैसे भी (issue 13026)

Issue 14412 उल्लेख का प्रस्ताव है:

एकाधिक FROM का उपयोग करना वास्तव में एक सुविधा नहीं है लेकिन एक बग (ओह ठीक है, सीमा तंग है और डॉकरफाइल में एकाधिक FROM के लिए कुछ उपयोग मामले हैं)।


अद्यतन मई 2017 (18 महीने बाद), docker (moby) 17.05-ce साथ।

से एकाधिक एक एकल डॉकरफ़ाइल में उपयोग किया जा सकता है।
देखें "Builder pattern vs. Multi-stage builds in Docker" और PR 31257 (Alex Ellis द्वारा) द्वारा Tõnis Tiigi

से पहले:

बिल्डर पैटर्न दो डोकर छवियों का उपयोग शामिल है - एक निर्माण प्रदर्शन करने के लिए और एक अन्य पहली छवि में निर्माण श्रृंखला के दंड और टूलींग के बिना पहले निर्माण के परिणामों जहाज के लिए ।

के बाद: - जो भी है पिछले FROM बयान अंतिम आधार छवि है

सामान्य वाक्य रचना अपने Dockerfile भीतर FROM अतिरिक्त बार जोड़ना शामिल है। मध्यवर्ती छवियों से कलाकृतियों और आउटपुट की प्रतिलिपि बनाने के लिए COPY --from=<base_image_number> का उपयोग करें।

उदाहरण:

FROM golang:1.7.3 as builder 
WORKDIR /go/src/github.com/alexellis/href-counter/ 
RUN go get -d -v golang.org/x/net/html 
COPY app.go . 
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . 

FROM alpine:latest 
RUN apk --no-cache add ca-certificates 
WORKDIR /root/ 
COPY --from=builder /go/src/github.com/alexellis/href-counter/app . 
CMD ["./app"] 

परिणाम दो छवियों, के निर्माण के लिए एक, बस परिणामी एप्लिकेशन के साथ एक (बहुत, ज्यादा छोटे) होगा

REPOSITORY   TAG     IMAGE ID   CREATED    SIZE 

multi    latest    bcbbf69a9b59  6 minutes ago  10.3MB 
golang    1.7.3    ef15416724f6  4 months ago  672MB 
+0

एकाधिक FROMs को हटाने के बारे में करुणा। यह मुझे सबसे उपयोगी लगता है, खासकर निर्भरता तंत्र की अनुपस्थिति में। आरपीएम के साथ, उदाहरण के लिए, मैं घोषणा कर सकता हूं कि मेरे पैकेज को चलाने के लिए एक और पैकेज की आवश्यकता है ताकि इंस्टॉल समय पर सबकुछ मेरे लिए स्थापित हो जाए। हकीकत यह है कि अधिकांश चीज़ों को कई निर्भरताओं की आवश्यकता होगी ताकि एकाधिक एफओआरओएस की अनुपस्थिति में, यह कैसे काम करना चाहिए? – ekkis

+1

@ekkis जैसा कि मैंने अपने पिछले उत्तर में उल्लेख किया है (http://stackoverflow.com/a/33295292/6309), आप कई कंटेनरों को ऑर्केस्ट्रेट करके अपना सिस्टम चलाते हैं, प्रत्येक एक विशेष सेवा प्रदान करता है, और --link (https) के माध्यम से संचार करता है : //docs.docker.com/userguide/dockerlinks/#communication-across-links)। – VonC

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