क्या डॉकटर छवियों को 1 कंटेनर में संयोजित करने का एक तरीका है?


86

अभी मेरे पास कुछ डॉकफाइल्स हैं।

एक कैसेंड्रा 3.5 के लिए है, और यह है FROM cassandra:3.5

मेरे पास काफ्का के लिए एक डॉकरफाइल भी है, लेकिन टी थोड़ा अधिक जटिल है। यह है FROM java:openjdk-8-freऔर यह काफ्का और ज़ुकीपर को स्थापित करने के लिए एक लंबी कमान चलाता है।

अंत में, मेरे पास स्काला में लिखा गया एक आवेदन है जो एसबीटी का उपयोग करता है।

उस डॉकरफाइल के लिए, यह है FROM broadinstitute/scala-baseimage, जो मुझे जावा 8, स्केल 2.11.7, और एसटीबी 0.13.9 मिलता है, जो मुझे चाहिए।

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

मैं इन डॉकरफाइल्स को कैसे संयोजित करूं? मैं बस उन चीजों के साथ एक वातावरण कैसे बना सकता हूं, जिनमें बेक किया हुआ है?



@generalhenry अगर मैं चाहता था, तो क्या मैं कैसंड्रा 3.5 पाने के लिए सिर्फ कॉपी और पेस्ट करने के लिए आवश्यक डॉकटर नहीं रख सकता और अपने मुख्य डॉकफाइल में मुझे जावा, स्काला और एसबीटी प्राप्त करता?
डेविड

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

2
@generalhenry ज़रूर, कि अक्सर आप क्या करना चाहते हैं। लेकिन क्या होगा अगर आपको पाइपी से बाइनरी अजगर पैकेज संकलित करने के लिए जंग की आवश्यकता है? इस मामले में आप जंग और अजगर docker छवियों को संयोजित करना चाह सकते हैं। उनकी रचना करना काम नहीं करेगा।
टोबियास बर्गकविस्ट

जवाबों:


92

आप डॉकर 1.17 में पेश मल्टी-स्टेज बिल्ड फीचर के साथ कर सकते हैं

इस पर एक नजर डालिए:

FROM golang:1.7.3
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=0 /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]  

फिर छवि को सामान्य रूप से बनाएं:

docker build -t alexellis2/href-counter:latest

प्रेषक: https://docs.docker.com/develop/develop-images/multistage-build/

अंतिम परिणाम जटिलता के रूप में महत्वपूर्ण कमी के साथ पहले की तरह एक ही छोटी उत्पादन छवि है। आपको कोई मध्यवर्ती चित्र बनाने की आवश्यकता नहीं है और आपको अपने स्थानीय सिस्टम में किसी भी कलाकृतियों को निकालने की आवश्यकता नहीं है।

यह कैसे काम करता है? दूसरा FROM निर्देश अल्पाइन के साथ एक नया बिल्ड स्टेज शुरू करता है: इसके आधार के रूप में नवीनतम छवि। COPY --from = 0 लाइन पिछले चरण से इस नए चरण में निर्मित कलाकृतियों को कॉपी करती है। गो एसडीके और किसी भी मध्यवर्ती कलाकृतियों को पीछे छोड़ दिया जाता है, और अंतिम छवि में सहेजा नहीं जाता है।


7
मान लीजिए कि मैं दो आधार चित्रों को संयोजित करना चाहता हूं, जो बहुत चल रहे हैं और मेरे द्वारा बनाए नहीं हैं। उदाहरण के लिए, अगर मैं एक रस्ट ऐप चलाना चाहता हूं जिसमें GPU त्वरण है, तो मैं चाहता हूं कि मेरी छवि nvidia-dockerऔर का विलय हो rustlang/rust:nightly। बदले में ये चित्र अन्य छवियों के ऊपर रखे गए हैं। बहुपरत बिल्डरों का उपयोग करते हुए ऐसा करने के लिए, मुझे उन सभी फ़ाइलों में से एक को जानना और निर्दिष्ट करना होगा, जिसे मैं दूसरी छवि पर कॉपी करना चाहता हूं - असंभव लगता है, विशेष रूप से उस सेट को बदल सकता है जब भी अपस्ट्रीम छवि बदलती है। क्या मेरे द्वारा इसे सही से पढ़ा जा रहा है?
मैसकॉन्ग

3
@ सम्सकोंक में मुझे सफलता मिली है: FROM a/a:latest FROM b/b:latest COPY --from=0 / / शायद भयानक अभ्यास है, लेकिन यह काम करता है। यह ज्यादातर मेरी खुद की जिज्ञासा के लिए था जो मैं उत्पादन में उपयोग करता था।
13

4
लानत की बात मेरे लिए काम नहीं करती है। यह पहले की तरह है "FROM" पूरी तरह से अनदेखा हो जाता है।
डिमिडक

यहाँ भी: मैं करना चाहता हूँ FROM image1; CMD image1command; FROM image2; CMD image2command;यह बिल्कुल काम नहीं कर रहा है। हमेशा सिर्फ 2 कमांड
CGFoX

कि कंटेनर के उद्देश्य को हराता है न?
लुइज़ फेलिप

22

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

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

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

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

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


मल्टी-स्टेज बिल्ड की शुरुआत के बाद से यह उत्तर पुराना है।
slikts

9

निम्नलिखित उत्तर 1.7 और इसके बाद के संस्करण के लिए लागू होता है:

मैं उपयोग करना पसंद करूंगा --from=NAMEऔर from image as NAME क्यों? आप का उपयोग कर सकते हैं --from=0और ऊपर है, लेकिन जब आप dockerfile में कई docker चरणों का प्रबंधन करने के लिए यह थोड़ा मुश्किल हो सकता है।

नमूना उदाहरण:

FROM golang:1.7.3 as backend
WORKDIR /backend
RUN go get -d -v golang.org/x/net/html  
COPY app.go .
RUN  #install some stuff, compile assets....

FROM golang:1.7.3 as assets
WORKDIR /assets
RUN ./getassets.sh

FROM nodejs:latest as frontend 
RUN npm install
WORKDIR /assets
COPY --from=assets /asets .
CMD ["./app"] 

FROM alpine:latest as mergedassets
WORKDIR /root/
COPY --from=merge ./
COPY --from=backend ./backend .
CMD ["./app"]

नोट: dockerfile को ठीक से प्रबंधित करने से docker की छवि बनाने में मदद मिलेगी। इस प्रक्रिया में मदद करने के लिए आंतरिक रूप से डॉकिंग यूजर्स डॉकिंग लेयर कैशिंग, छवि को फिर से बनाया जाना है।


7

हां, आप एक सिंगल डॉकर इमेज में पूरे सॉफ्टवेयर को रोल कर सकते हैं ( GitLab ऐसा करता है, जिसमें एक इमेज जिसमें पोस्टग्रैज और बाकी सभी चीजें शामिल हैं), लेकिन सामान्यता सही है - यह डॉकर का उपयोग करने का सामान्य तरीका नहीं है।

जैसा कि आप कहते हैं, कैसंड्रा और काफ्का आपके स्काला ऐप के लिए निर्भरता हैं , वे ऐप का हिस्सा नहीं हैं, इसलिए वे सभी एक ही छवि में नहीं हैं।

डॉकर कम्पोज़ के साथ कई कंटेनरों को ऑर्केस्ट्रेट करने के बाद एक अतिरिक्त व्यवस्थापक परत जुड़ती है, लेकिन यह आपको बहुत अधिक लचीलापन देता है:

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

4

आप 1 कंटेनर में docker की छवियों को संयोजित नहीं कर सके। मोबी मुद्दे में विस्तार से चर्चा देखें, मैं कैसे एक डॉकरीफाइल के माध्यम से कई छवियों को एक में जोड़ता हूं

आपके मामले के लिए, पूरी कैसंड्रा और काफ्का छवियों को शामिल नहीं करना बेहतर है। आवेदन केवल कैसंड्रा स्काला चालक और काफ्का स्काला चालक की आवश्यकता होगी। कंटेनर में केवल चालक शामिल होने चाहिए।


2

डॉकर छवियों का विलय नहीं करता है, लेकिन यदि उपलब्ध हो तो डॉकटरों के संयोजन को रोकना कुछ भी नहीं है, और उन्हें एक मोटी छवि में रोल करना, जिसे आपको बनाने की आवश्यकता होगी। ऐसे समय में जहां यह समझ में आता है, हालांकि, एक कंटेनर में कई प्रक्रियाओं को चलाने के लिए सबसे डॉकटर हठधर्मिता इसे कम वांछनीय के रूप में इंगित करेगी विशेष रूप से माइक्रोसर्विस आर्किटेक्चर के साथ (हालांकि नियम सही टूटने के लिए हैं?)


1

मुझे डॉकटर की आवश्यकता है: नवीनतम और अजगर: गिट्लाब सीआई के लिए नवीनतम चित्र। यहां वह है जो मैंने जुटाया:

FROM ubuntu:latest
RUN apt update
RUN apt install -y sudo
RUN sudo apt install -y docker.io
RUN sudo apt install -y python3-pip
RUN sudo apt install -y python3
RUN docker --version
RUN pip3 --version
RUN python3 --version

जब मैंने निर्माण किया और इसे अपने डॉकटर हब रेपो में धकेल दिया:

docker build -t docker-hub-repo/image-name:latest path/to/Dockerfile
docker push docker-hub-repo/image-name:latest

docker loginपुश करने से पहले मत भूलना

आशा है कि इससे सहायता मिलेगी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.