निर्माण के दौरान डॉकफाइल में डॉक कंटेनर में होस्ट वॉल्यूम कैसे माउंट करें


236

मूल प्रश्न: डॉकरफाइल में वोल्यूम निर्देश का उपयोग कैसे करें?

वास्तविक प्रश्न जो मैं हल करना चाहता हूं - वह है कि निर्माण के दौरान डॉकएफ़िले में डॉक कंटेनर में होस्ट वॉल्यूम कैसे माउंट करें, अर्थात, जिसके docker run -v /export:/exportदौरान क्षमता हो docker build

इसके पीछे का कारण, मेरे लिए, डॉकटर में चीजों का निर्माण करते समय, मैं नहीं चाहता कि वे ( apt-get install) एक ही डॉक में बंद किए गए कैश हों, लेकिन उन्हें साझा / पुन: उपयोग करने के लिए। यही मुख्य कारण है कि मैं इस सवाल के बारे में पूछ रहा हूं।

नवीनतम अद्यतन:

Docker v18.09 से पहले, सही उत्तर वही होना चाहिए जो इसके साथ शुरू होता है:

बिल्ड के दौरान वॉल्यूम माउंट करने का एक तरीका है, लेकिन इसमें डॉकरफाइल्स शामिल नहीं है।

हालाँकि, यह एक खराब कहा गया, संगठित और समर्थित जवाब था। जब मैं अपने कर्ता को पुनः स्थापित कर रहा था, तो मैं निम्नलिखित लेख पर ठोकर खाने के लिए हुआ:

Apt-cacher-ng सेवा https://docs.docker.com/engine/examples/apt-cacher-ng/ पर Dockerize
करें

यह सीधे तौर पर नहीं बल्कि अप्रत्यक्ष रूप से इस प्रश्न का हल है। यह रूढ़िवादी तरीका है जो हमें करने का सुझाव देता है। और मैं मानता हूं कि मैं यहां जो पूछना चाह रहा था, उससे बेहतर है।

दूसरा तरीका है, नव स्वीकृत जवाब , जैसे, v18.09 में बिल्डकिट।

जो भी आप पर सूट करे।


था: वहाँ एक समाधान था - रॉकर, जो डोकर से नहीं था, लेकिन अब उस घुमाव को बंद कर दिया गया है, मैं फिर से जवाब " वापस संभव नहीं" पर वापस करता हूं ।


पुराना अपडेट: तो जवाब "संभव नहीं है"। मैं इसे एक उत्तर के रूप में स्वीकार कर सकता हूं क्योंकि मुझे पता है कि इस मुद्दे पर https://github.com/docker/docker/issues/3156 पर बड़े पैमाने पर चर्चा की गई है । मैं समझ सकता हूं कि पोर्टेकर डेवलपर के लिए एक सर्वोपरि मुद्दा है; लेकिन एक डॉक उपयोगकर्ता के रूप में, मुझे कहना है कि मैं इस लापता सुविधा के बारे में बहुत निराश हूं। उपर्युक्त चर्चा से एक उद्धरण के साथ मुझे अपना तर्क बंद करने दें: " मैं बेस इमेज के रूप में जेंटू का उपयोग करना चाहूंगा, लेकिन निश्चित रूप से नहीं चाहता कि पोर्टेज ट्री डेटा का 1GB किसी भी लेयर्स में हो जब एक बार इमेज बन गई हो। आप। अगर यह विशाल चित्र पेड़ के लिए छवि के रूप में स्थापित करने के लिए नहीं था, तो कुछ अच्छे कॉम्पैक्ट कंटेनर हो सकते हैं।"हाँ, मैं जो कुछ भी ज़रूरत है उसे डाउनलोड करने के लिए wget या curl का उपयोग कर सकता हूं, लेकिन यह तथ्य कि केवल एक पोर्टेबिलिटी पर विचार अब मुझे डाउनलोड करने के लिए मजबूर कर रहा है> पोर्टेज ट्री का 1GB हर बार जब मैं एक Gentoo आधार छवि बनाता हूं तो यह न तो कुशल है और न ही उपयोगकर्ता के अनुकूल है।" अधिक, पैकेज रिपॉजिटरी हमेशा के लिए / usr / पोर्टेज के तहत होगा, इस प्रकार Gentoo के लिए हमेशा योग्य। फिर, मैं निर्णय का सम्मान करता हूं, लेकिन कृपया मुझे अपनी निराशा व्यक्त करने के साथ-साथ इस समय में भी अनुमति दें।


विवरण में मूल प्रश्न :

से

संस्करणों को वॉल्यूम के माध्यम से साझा करें
http://docker.readthedocs.org/en/v0.7.3/use/working_with_olumes/

यह कहता है कि डेटा वॉल्यूम सुविधा "डॉकर रिमोट एपीआई के संस्करण 1 के बाद से उपलब्ध है।" मेरा डॉक वर्जन १.२.० है, लेकिन मुझे उपरोक्त लेख में दिया गया उदाहरण काम नहीं आया:

# BUILD-USING:        docker build -t data .
# RUN-USING:          docker run -name DATA data
FROM          busybox
VOLUME        ["/var/volume1", "/var/volume2"]
CMD           ["/usr/bin/true"]

डॉकर कमांड में होस्ट-माउंटेड वॉल्यूम को डॉक कंटेनर में माउंट करने का उचित तरीका क्या है?

$ apt-cache policy lxc-docker
lxc-docker:
  Installed: 1.2.0
  Candidate: 1.2.0
  Version table:
 *** 1.2.0 0
        500 https://get.docker.io/ubuntu/ docker/main amd64 Packages
        100 /var/lib/dpkg/status

$ cat Dockerfile 
FROM          debian:sid

VOLUME        ["/export"]
RUN ls -l /export
CMD ls -l /export

$ docker build -t data .
Sending build context to Docker daemon  2.56 kB
Sending build context to Docker daemon 
Step 0 : FROM          debian:sid
 ---> 77e97a48ce6a
Step 1 : VOLUME        ["/export"]
 ---> Using cache
 ---> 59b69b65a074
Step 2 : RUN ls -l /export
 ---> Running in df43c78d74be
total 0
 ---> 9d29a6eb263f
Removing intermediate container df43c78d74be
Step 3 : CMD ls -l /export
 ---> Running in 8e4916d3e390
 ---> d6e7e1c52551
Removing intermediate container 8e4916d3e390
Successfully built d6e7e1c52551

$ docker run data
total 0

$ ls -l /export | wc 
     20     162    1131

$ docker -v
Docker version 1.2.0, build fa7b24f

जाहिरा तौर पर अधिक वर्तमान सुविधा अनुरोध (ऐसा नहीं है कि मैं इसे लागू करने की उम्मीद करता हूं, लेकिन बस मामले में): docker / docker # 14080
जेसी ग्लेक

वास्तव में एक व्यापक चर्चा है कि इसे निर्माण के दौरान एक मेजबान निर्देशिका और कंटेनर निर्देशिका को लिंक करने की अनुमति नहीं दी जानी चाहिए VOLUME ~/host_dir ~/container_dir। चर्चा काफी व्यापक है, क्या इसका कारण बताने के लिए संक्षिप्त तरीका है?
चार्ली पार्कर

जवाबों:


34

सबसे पहले, जवाब देने के लिए " VOLUMEकाम क्यों नहीं करता है?" जब आप VOLUMEDockerfile में परिभाषित करते हैं , तो आप केवल लक्ष्य को परिभाषित कर सकते हैं, वॉल्यूम के स्रोत को नहीं। बिल्ड के दौरान, आपको केवल इससे एक अनाम वॉल्यूम मिलेगा। उस अनाम वॉल्यूम को प्रत्येक RUNकमांड पर लगाया जाएगा , जो कि चित्र की सामग्री के साथ है, और फिर RUNकमांड के अंत में छोड़ दिया गया है । केवल कंटेनर में परिवर्तन सहेजे जाते हैं, मात्रा में परिवर्तन नहीं।


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

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

FROM debian:sid as builder
COPY export /export
RUN compile command here >/result.bin

FROM debian:sid
COPY --from=builder /result.bin /result.bin
CMD ["/result.bin"]

इसके परिणामस्वरूप एक ऐसा निर्माण होगा जिसमें केवल परिणामी बाइनरी होती है, न कि पूर्ण / निर्यात निर्देशिका।


बिल्डकिट 18.09 में प्रायोगिक रूप से बाहर आ रही है। यह बिल्ड प्रक्रिया का एक पूरा नया स्वरूप है, जिसमें फ्रंटेंड पार्सर को बदलने की क्षमता भी शामिल है। उन पार्सर परिवर्तनों में से एक ने RUN --mountविकल्प को लागू किया है जो आपको अपने रन कमांड के लिए कैश डायरेक्टरी को माउंट करने देता है। जैसे यहाँ एक है जो कुछ डेबियन डायरेक्टरीज़ की गणना करता है (डेबियन इमेज के पुन: विन्यास के साथ, इससे पैकेजों की पुनः स्थापना हो सकती है):

# syntax = docker/dockerfile:experimental
FROM debian:latest
RUN --mount=target=/var/lib/apt/lists,type=cache \
    --mount=target=/var/cache/apt,type=cache \
    apt-get update \
 && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
      git

आपके पास जो भी एप्लिकेशन कैश है, उसके लिए आप कैश डायरेक्टरी को एडजस्ट करेंगे, उदाहरण के लिए मावेन के लिए $ HOME / .m2, या गोलंग के लिए /root/.cache।


TL; DR: उत्तर यहां है: उस RUN --mountवाक्य रचना के साथ , आप बिल्ड-रेफरेंस से केवल रीड-ओनली डायरेक्ट्रीज़ को भी बांध सकते हैं। फ़ोल्डर का निर्माण संदर्भ में होना चाहिए, और इसे होस्ट या बिल्ड क्लाइंट पर वापस मैप नहीं किया जाना चाहिए:

# syntax = docker/dockerfile:experimental
FROM debian:latest
RUN --mount=target=/export,type=bind,source=export \
    process export directory here...

ध्यान दें कि क्योंकि निर्देशिका को संदर्भ से माउंट किया गया है, यह भी केवल पढ़ने के लिए मुहिम शुरू की है, और आप परिवर्तन को होस्ट या क्लाइंट पर वापस नहीं ला सकते हैं। जब आप निर्माण करते हैं, तो आप एक 18.09 या नया इंस्टॉल चाहते हैं और बिल्डकिट को सक्षम करते हैं export DOCKER_BUILDKIT=1

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


2
दुर्भाग्य से, विंडोज बिल्डकिट पर अभी तक संस्करण 18.09
वेस्ले

1
ऐसा लगता है कि "आर्महफ" या तो "माउंट" का समर्थन नहीं करता है।
माइक

2
मुझे "डेमन से त्रुटि प्रतिक्रिया मिल रही है: Dockerfile पार्स एरर लाइन xx: अज्ञात ध्वज: माउंट" OSX पर
क्रिस्टोकिवी

1
डॉक-कंपोज़ के लिए समर्थन अभी तक नहीं है, लेकिन आपको छवियों के निर्माण के लिए कंपोज़ की आवश्यकता नहीं है। ट्रैक करने के लिए मुद्दा: github.com/moby/buildkit/issues/685
BMitch

2
इस बारे में दस्तावेज़ीकरण: github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/…
ड्रू लेस्सुर

116

माउंट को क्या करना है, VOLUMEयह बताने के लिए अनुदेश का उपयोग करना संभव नहीं है । यह गंभीरता से पोर्टेबिलिटी को तोड़ देगा। यह निर्देश डॉकटर को बताता है कि उन निर्देशिकाओं में सामग्री छवियों में नहीं जाती है और कमांड लाइन पैरामीटर का उपयोग करके अन्य कंटेनरों से पहुँचा जा सकता है । आपको होस्ट से डायरेक्ट्री एक्सेस करने के लिए कंटेनर को चलाना होगा ।--volumes-from-v /path/on/host:/path/in/container

बिल्ड के दौरान होस्ट वॉल्यूम को माउंट करना संभव नहीं है। कोई विशेषाधिकार प्राप्त निर्माण नहीं है और मेजबान बढ़ते गंभीरता से पोर्टेबिलिटी को भी कम करेगा। निर्माण के लिए आपको जो कुछ भी चाहिए उसे डाउनलोड करने के लिए आप wget या curl का उपयोग करने का प्रयास कर सकते हैं।


2
धन्यवाद। सवाल संशोधित। वास्तविक प्रश्न जो मैं हल करना चाहता हूं - वह है कि निर्माण के दौरान डॉकएफ़िले में डॉक कंटेनर में होस्ट वॉल्यूम कैसे माउंट करें। धन्यवाद।
15:14 बजे xpt

2
संभव नहीं। संशोधित उत्तर देखें
एंड्रियास स्टीफन

3
मैं पोर्टेबिलिटी के लिए "संभावित" बीमार दुष्प्रभावों की सराहना कर सकता हूं, लेकिन इस विकल्प को रखने के लिए एक वैध उपयोग मामला भी है। मेरे मामले में, मैं उपयोगकर्ताओं को "निर्देशिका में स्थानांतरित करने और 'डॉक रन' कमांड चलाने के लिए $ (पीडब्ल्यूडी) के पास कुछ कंटेनर डायर को चलाने में सक्षम होना पसंद करूंगा। $ (PWD) सुनिश्चित करता है कि पोर्टेबिलिटी बनी रहे। हालांकि यह एक कोने का मामला हो सकता है, यह मुझे बहुत मदद करेगा जहां मैं उपयोगकर्ता द्वारा प्रदान की गई स्क्रिप्ट के लिए रनटाइम वातावरण वितरित कर रहा हूं।
ntwrkguru

64

अद्यतन करें: कोई व्यक्ति उत्तर के रूप में नहीं लेगा, और मुझे यह बहुत पसंद है, विशेष रूप से इस विशेष प्रश्न पर।

अच्छा समाचार, अब एक रास्ता है -

समाधान रॉकर है: https://github.com/grammarly/rocker

जॉन यानि ने कहा , "IMO, यह डॉकफेरील के सभी कमजोर बिंदुओं को हल करता है, जिससे यह विकास के लिए उपयुक्त है।"

घुमाव

https://github.com/grammarly/rocker

नए आदेशों को पेश करके, रॉकर का लक्ष्य निम्नलिखित उपयोग के मामलों को हल करना है, जो सादे डॉकर के साथ दर्दनाक हैं:

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

और अधिक। ये सबसे महत्वपूर्ण मुद्दे हैं जो ग्रामर में डॉकटर के हमारे गोद लेने को रोक रहे थे।

अद्यतन: घुमाव को आधिकारिक प्रोजेक्ट रेपो के अनुसार गितुब में बंद कर दिया गया है

2018 की शुरुआत में, कंटेनर पारिस्थितिकी तंत्र तीन साल पहले की तुलना में कहीं अधिक परिपक्व है जब यह परियोजना शुरू की गई थी। अब, घुमाव की कुछ महत्वपूर्ण और उत्कृष्ट विशेषताओं को डॉक बिल्ड या अन्य अच्छी तरह से समर्थित उपकरणों द्वारा आसानी से कवर किया जा सकता है, हालांकि कुछ विशेषताएं घुमाव के लिए अद्वितीय बनी हुई हैं। अधिक जानकारी के लिए https://github.com/grammarly/rocker/issues/199 देखें ।


मैं समस्या नंबर 1 को हल करने के लिए रॉकर का उपयोग करने की कोशिश कर रहा हूं, लेकिन माउंट कमांड काम नहीं करेगा, और बनाई गई छवि में होस्ट फ़ोल्डर शामिल नहीं है। मेरी डॉकरीफाइल माउंट कमांड इस तरह दिखती है - MOUNT ~/code/docker-app-dev/new-editor/:/src/और मेरा रॉकर बिल्ड कमांड यह है - rocker build -f Dockerfile .। मैं क्या गलत कर रहा हूँ?
यार्न ईडन

शायद एक असली मेजबान पथ का उपयोग करने का प्रयास करें? ~बोर्न शेल मेटाचैकर है।
जेसी ग्लिक

Rocker builddocker runकमांड-लाइन विकल्पों की अनुमति नहीं देता है , इसलिए वर्तमान में जैसी चीजों की अनुमति नहीं देता है --privileged
मोंटी वाइल्ड

हाय @xpt, क्या हम एक और अपडेट प्राप्त कर सकते हैं क्योंकि रॉकर अब बंद हो गया है
शारदज

अब उस घुमाव को बंद कर दिया गया है, मैं जवाब को फिर से "संभव नहीं" पर वापस करता हूं। ओपी और चयनित उत्तर देखें।
xpt

14

बिल्ड के दौरान वॉल्यूम माउंट करने का एक तरीका है, लेकिन इसमें डॉकरफाइल्स शामिल नहीं है।

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

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

अपडेट करें:

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

CONTAINER_ID=$(docker run -dit ubuntu:16.04)
docker cp build.sh $CONTAINER_ID:/build.sh
docker exec -t $CONTAINER_ID /bin/sh -c '/bin/sh /build.sh'
docker commit $CONTAINER_ID $REPO:$TAG
docker stop $CONTAINER_ID

6
+1 क्या आप कृपया दूसरे पैराग्राफ में दिए गए निर्देशों पर थोड़ा और विस्तार कर सकते हैं। उदाहरण के लिए, यदि आधार है debian:wheezyऔर शेल स्क्रिप्ट है build.sh, तो कोई विशिष्ट निर्देश क्या उपयोग करेगा?
Drux

6

जैसे ही आप कंटेनर चलाते हैं, आपके मेजबान पर एक निर्देशिका बनाई जाती है और कंटेनर में घुड़सवार की जाती है। आप पता लगा सकते हैं कि यह किस डायरेक्टरी के साथ है

$ docker inspect --format "{{ .Volumes }}" <ID>
map[/export:/var/lib/docker/vfs/dir/<VOLUME ID...>]

यदि आप अपने कंटेनर के अंदर अपने होस्ट से एक निर्देशिका माउंट करना चाहते हैं, तो आपको -vपैरामीटर का उपयोग करना होगा और निर्देशिका को निर्दिष्ट करना होगा। आपके मामले में यह होगा:

docker run -v /export:/export data

तो आप अपने कंटेनर के अंदर होस्ट फ़ोल्डर का उपयोग करेंगे।


1
धन्यवाद। सवाल संशोधित। वास्तविक प्रश्न जो मैं हल करना चाहता हूं - वह है कि निर्माण के दौरान डॉकएफ़िले में डॉक कंटेनर में होस्ट वॉल्यूम कैसे माउंट करें। धन्यवाद।
xpt

कृपया अपने प्रश्नों को इतने कठोर तरीके से संशोधित न करें । इससे मेरा प्रश्न अमान्य हो जाता है, हालांकि यह आपके संपादन से पहले पूरी तरह वैध था। इसके बजाय एक नया सवाल पूछने पर विचार करें।
Behe

11
मूल प्रश्न : डॉकरफाइल में वोल्यूम निर्देश का उपयोग कैसे करें? यह आज भी सवाल के बहुत शुरुआत में है। आपका उत्तर रन टाइम के लिए था , और मेरा प्रश्न हमेशा बिल्ड टाइम के बारे में रहा है , जो कि डॉकफेराइल के लिए है।
XPT

4

मुझे लगता है कि आप एक डॉक कमांड के माध्यम से बिल्ड को चलाने के लिए जो करना चाहते हैं वह कर सकते हैं जो खुद एक डॉक कंटेनर के अंदर चलाया जाता है। देखें डॉकटर अब डॉकटर के भीतर चल सकता है | डॉकर ब्लॉग । इस तरह की एक तकनीक, लेकिन जो वास्तव में बाहरी डॉकटर को एक कंटेनर से एक्सेस करती थी, का उपयोग किया गया था, उदाहरण के लिए, सबसे छोटा संभव डॉकटर कंटेनर बनाने के लिए खोज करते हुए ज़ेबिया ब्लॉग

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


3

यह बदसूरत है, लेकिन मैंने इस तरह का एक सादृश्य हासिल किया:

Dockerfile:

FROM foo
COPY ./m2/ /root/.m2
RUN stuff

imageBuild.sh:

docker build . -t barImage
container="$(docker run -d barImage)"
rm -rf ./m2
docker cp "$container:/root/.m2" ./m2
docker rm -f "$container"

मेरे पास एक जावा बिल्ड है जो ब्रह्मांड को /root/.m2 में डाउनलोड करता है, और हर बार ऐसा करता हैimageBuild.shबिल्ड के बाद होस्ट पर उस फ़ोल्डर की सामग्री को कॉपी करता है, और Dockerfileउन्हें अगले बिल्ड के लिए छवि में वापस कॉपी करता है।

यह कुछ ऐसा है कि एक वॉल्यूम कैसे काम करेगा (यानी यह बिल्ड्स के बीच बनी रहती है)।


यह डॉकर-आधारित निरंतर एकीकरण उर्फ ​​सीआई के लिए एक व्यवहार्य समाधान है। पुस्तकालयों और संकलकों को सेट करें और डॉकरीफाइल कमांड के माध्यम से रन बनाएं, छवि को केवल कंटेनर बनाने के लिए तुच्छ रूप से लॉन्च करें, और अंत में एक .deb की तरह वांछित कलाकृतियों को कॉपी करें। काम करने के लिए लगता है, यह पोस्ट करने के लिए धन्यवाद।
क्रिसनटाउन

यह समाधान आपको सभी फ़ाइलों के साथ ./m2/ में एक छवि छोड़ता है - जिसकी आपको आवश्यकता है और जिसे आपको आवश्यकता नहीं है - और इससे बड़ी उत्पादन छवियां बन सकती हैं, जो वांछित नहीं है! बाहरी निर्भरता निर्देशिका में बढ़ते के साथ केवल आवश्यक फ़ाइलों को छवि में कॉपी किया जाएगा।
मार्को क्रैन्ज

यदि आप छवि को प्रकाशित करना चाहते हैं, तो संभवत: बस इंतजार करना सबसे अच्छा है और मावेन को हर बार अपनी निर्भरता को डाउनलोड करने दें। यह हैक केवल तभी समझ में आता है जब आप परीक्षण के लिए एक छवि का मंचन कर रहे हैं - एक छवि जो अंत उपयोगकर्ताओं के साथ कभी भी संपर्क में नहीं आएगी।
MatrixManAtYrService

1

शेल स्क्रिप्ट के बिना, बिल्ड और कमिट का उपयोग करके 2-चरण दृष्टिकोण का एक सरलीकृत संस्करण है। इसमें शामिल है:

  1. वॉल्यूम के बिना , आंशिक रूप से छवि का निर्माण
  2. वॉल्यूम के साथ एक कंटेनर चलाना , परिवर्तन करना, फिर परिणाम करना, मूल छवि नाम की जगह।

अपेक्षाकृत छोटे बदलावों के साथ अतिरिक्त कदम बिल्ड टाइम के लिए केवल कुछ सेकंड जोड़ता है।

मूल रूप से:

docker build -t image-name . # your normal docker build

# Now run a command in a throwaway container that uses volumes and makes changes:
docker run -v /some:/volume --name temp-container image-name /some/post-configure/command

# Replace the original image with the result:
# (reverting CMD to whatever it was, otherwise it will be set to /some/post-configure/command)   
docker commit --change="CMD bash" temp-container image-name 

# Delete the temporary container:
docker rm temp-container

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


1

जैसा कि कई पहले ही जवाब दे चुके हैं, बिल्ड के दौरान होस्ट वॉल्यूम बढ़ाना संभव नहीं है। मैं सिर्फ docker-composeरास्ता जोड़ना चाहूंगा , मुझे लगता है कि यह अच्छा होगा, ज्यादातर विकास / परीक्षण उपयोग के लिए

Dockerfile

FROM node:10
WORKDIR /app
COPY . .
RUN npm ci
CMD sleep 999999999

डोकर-compose.yml

version: '3'
services:
  test-service:
    image: test/image
    build:
      context: .
      dockerfile: Dockerfile
    container_name: test
    volumes:
      - ./export:/app/export
      - ./build:/app/build

और अपने कंटेनर को चलाएं docker-compose up -d --build

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