मैं एक डोकर कंटेनर के भीतर से काम कर रहे मेवेन ऑफ़लाइन निर्माण प्राप्त करने की कोशिश कर रहा हूँ। मैंने बिल्डकिट सक्षम किया है। मैंने होस्ट मशीन के /root/.m2 में निर्भरता को कैश करने के लिए mvn dependency:go-offline -s ~/checkouts/settings.xml चलाया है। मैं इसे कंटेनर के अंदर उपयोग करना चाहता हूं जो मेवेन प्रोजेक्ट बनाता है।

यहाँ मेरा डॉकरफाइल है:

#syntax=docker/dockerfile:experimental
FROM maven:3.6.1-jdk-11 AS build
WORKDIR /
COPY . /
RUN --mount=type=cache,target=/root/.m2 mvn -o install 

FROM scratch
COPY --from=build /admin/admin- 
rest/target/admin-rest.war /webapps/ROOT.war

जब मैं इस डॉकरफाइल को docker build करने का प्रयास करता हूं, तो मुझे निम्न त्रुटि मिलती है:

प्लगइन org.codehaus.mojo:build-helper-maven-plugin:3.0.0 या इसका कोई एक निर्भरता को हल नहीं किया जा सका: केंद्रीय तक नहीं पहुंच सकता (https://repo.maven.apache.org/maven2) ऑफलाइन मोड में और विरूपण साक्ष्य org.codehaus.mojo:build-helper-maven-plugin:jar:3.0.0 नहीं है इससे पहले डाउनलोड किया जा चुका है। -> [सहायता 1]

मेरा डॉकर संस्करण:

Client:
 Version:           18.09.6
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        481bc77
 Built:             Sat May  4 02:35:57 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.1
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       74b1e89
  Built:            Thu Jul 25 21:19:41 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.5
  GitCommit:        bb71b10fd8f58240ca47fbb579b9d1028eea7c84
 runc:
  Version:          1.0.0-rc6+dev
  GitCommit:        2b18fe1d885ee5083ef9f0838fee39b62d653e30
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

क्या मैं अपनी इस उम्मीद में सही हूं कि मेरी मेजबान मशीन से /root/.m2 को डॉकटर कंटेनर वातावरण के अंदर /root/.m2 पर आरोहित करने की आवश्यकता है? और जब मैं mvn -o install चलाता हूं तो उसे माउंटेड /root/.m2?

मैंने tail -f /dev/null जोड़ा, दूसरे बिल्ड चरण को हटा दिया और इसे डीबग करने के लिए कैश-माउंट निर्देश के साथ mvn install को mvn version में बदल दिया। मैं देखता हूं कि कंटेनर के अंदर /root/.m2 पर कुछ भी माउंट नहीं होता है। यह खाली है। (सुनिश्चित नहीं है कि यह इसे डीबग करने का सही तरीका है क्योंकि छवि बनने के बाद इसे अनमाउंट किया जा सकता है)

10
A.R.K.S 21 अगस्त 2019, 00:48

1 उत्तर

सबसे बढ़िया उत्तर

--mount=type=cache को डॉकर में एक नामित वॉल्यूम के रूप में सोचना सबसे अच्छा है, जिसे बिल्डकिट द्वारा प्रबंधित किया जाता है, और संभावित रूप से हटा दिया जाता है यदि बिल्डकिट कैश पूर्ण हो जाता है या एक प्रून का अनुरोध किया जाता है। अगली बार जब आप कोई बिल्ड चलाते हैं, तो वही नामित वॉल्यूम उपलब्ध हो सकता है, जो महत्वपूर्ण रूप से डाउनलोडिंग डिपेंडेंसीज़ में खर्च किए गए बिल्ड समय को कम करता है। बहुत उपयोगी होते हुए भी, ऐसा प्रतीत नहीं होता है कि आप यहाँ क्या खोज रहे हैं। इस तरह के कैश का उपयोग करने के लिए, आपको go-offline को Dockerfile में पहले के चरण के रूप में शामिल करना होगा:

#syntax=docker/dockerfile:experimental
FROM maven:3.6.1-jdk-11 AS build
WORKDIR /
# copy just the pom.xml for cache efficiency
COPY ./pom.xml /
# go-offline using the pom.xml
RUN --mount=type=cache,target=/root/.m2 mvn dependency:go-offline
# now copy the rest of the code and run an offline build
COPY . /
RUN --mount=type=cache,target=/root/.m2 mvn -o install 

FROM scratch
COPY --from=build /admin/admin-rest/target/admin-rest.war /webapps/ROOT.war

होस्ट से कंटेनर में निर्देशिका माउंट करने के लिए, आप जो खोज रहे हैं वह एक बाइंड माउंट है। और बिल्डकिट की प्रायोगिक सेटिंग्स के साथ, यह उपलब्ध है, लेकिन केवल बिल्ड संदर्भ के लिए, बिल्ड होस्ट पर किसी भी मनमानी निर्देशिका के लिए नहीं। उसके लिए, आप अपनी .m2 निर्देशिका को बिल्ड संदर्भ निर्देशिका में रख सकते हैं और फिर अपने Dockerfile में निम्न पंक्ति का उपयोग कर सकते हैं:

RUN --mount=type=bind,source=./.m2,target=/root/.m2,rw mvn -o install

ध्यान दें कि यदि कोई निर्भरता बदलती है, तो मावेन फिर से नेटवर्क से जुड़ने का प्रयास कर सकता है।

17
BMitch 21 अगस्त 2019, 03:20