काम करने का उदाहरण।
यह एक स्प्रिंग बूट ट्यूटोरियल नहीं है। यह एक प्रश्न का अद्यतन उत्तर है कि डॉक कंटेनर में मावेन निर्माण कैसे चलाया जाए।
प्रश्न मूल रूप से 4 साल पहले पोस्ट किया गया था।
1. एक आवेदन उत्पन्न करें
डेमो ऐप जनरेट करने के लिए स्प्रिंग इनिशियलाइज़र का उपयोग करें
https://start.spring.io/
स्थानीय रूप से ज़िप संग्रह निकालें
2. डॉकरफाइल बनाएं
#
# Build stage
#
FROM maven:3.6.0-jdk-11-slim AS build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package
#
# Package stage
#
FROM openjdk:11-jre-slim
COPY --from=build /home/app/target/demo-0.0.1-SNAPSHOT.jar /usr/local/lib/demo.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/usr/local/lib/demo.jar"]
ध्यान दें
- यह उदाहरण एक मल्टी-स्टेज बिल्ड का उपयोग करता है । पहले चरण का उपयोग कोड बनाने के लिए किया जाता है। दूसरे चरण में केवल निर्मित जार और इसे चलाने के लिए एक JRE होता है (ध्यान दें कि जार को चरणों के बीच कैसे कॉपी किया जाता है)।
3. छवि का निर्माण
docker build -t demo .
4. छवि को चलाएं
$ docker run --rm -it demo:latest
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.3.RELEASE)
2019-02-22 17:18:57.835 INFO 1 --- [ main] com.example.demo.DemoApplication : Starting DemoApplication v0.0.1-SNAPSHOT on f4e67677c9a9 with PID 1 (/usr/local/bin/demo.jar started by root in /)
2019-02-22 17:18:57.837 INFO 1 --- [ main] com.example.demo.DemoApplication : No active profile set, falling back to default profiles: default
2019-02-22 17:18:58.294 INFO 1 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 0.711 seconds (JVM running for 1.035)
विविध
मॉक बिल्ड को कैश जार में स्थानीय रिपॉजिटरी का उपयोग करने के लिए कैसे अनुकूलित किया जा सकता है, इस पर डॉकर हब प्रलेखन पढ़ें।
अपडेट (2019-02-07)
यह प्रश्न अब 4 वर्ष का है और उस समय में यह कहना उचित है कि डॉकटर के उपयोग से निर्माण में महत्वपूर्ण परिवर्तन आया है।
विकल्प 1: मल्टी-स्टेज बिल्ड
यह नई शैली आपको अधिक हल्के वजन वाली छवियां बनाने में सक्षम बनाती है जो आपके बिल्ड टूल और सोर्स कोड को एन्क्रिप्ट नहीं करती हैं।
यहाँ उदाहरण फिर से मावेन के वांछित संस्करण का उपयोग करके निर्माण के पहले चरण को चलाने के लिए आधिकारिक मावेन आधार छवि का उपयोग करता है। फ़ाइल का दूसरा भाग परिभाषित करता है कि निर्मित जार को अंतिम आउटपुट छवि में कैसे इकट्ठा किया जाता है।
FROM maven:3.5-jdk-8 AS build
COPY src /usr/src/app/src
COPY pom.xml /usr/src/app
RUN mvn -f /usr/src/app/pom.xml clean package
FROM gcr.io/distroless/java
COPY --from=build /usr/src/app/target/helloworld-1.0.0-SNAPSHOT.jar /usr/app/helloworld-1.0.0-SNAPSHOT.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/usr/app/helloworld-1.0.0-SNAPSHOT.jar"]
ध्यान दें:
- मैं Google की डिस्ट्रोलेस आधार छवि का उपयोग कर रहा हूं , जो एक जावा ऐप के लिए बस पर्याप्त रन-टाइम प्रदान करने का प्रयास करता है।
विकल्प 2: जिब
मैंने इस दृष्टिकोण का उपयोग नहीं किया है, लेकिन जांच के योग्य लगता है क्योंकि यह आपको डॉकफ़र्ट्स :-) जैसी गंदी चीज़ों को बनाने के बिना चित्र बनाने में सक्षम बनाता है
https://github.com/GoogleContainerTools/jib
परियोजना में एक मावेन प्लगइन है जो आपके कोड की पैकेजिंग को सीधे आपके मावेन वर्कफ़्लो में एकीकृत करता है।
मूल उत्तर (पूर्णता के लिए शामिल है, लेकिन लिखित उम्र पहले)
नई आधिकारिक छवियों का उपयोग करने का प्रयास करें, मावेन के लिए एक है
https://registry.hub.docker.com/_/maven/
छवि का उपयोग मावेन को बनाने के लिए एक संकलित अनुप्रयोग बनाने के लिए या निम्नलिखित उदाहरणों में, कंटेनर के भीतर मावेन निर्माण को चलाने के लिए किया जा सकता है।
उदाहरण 1 - एक कंटेनर के भीतर मावेन चल रहा है
निम्न आदेश आपके मावेन निर्माण को एक कंटेनर के अंदर चलाता है:
docker run -it --rm \
-v "$(pwd)":/opt/maven \
-w /opt/maven \
maven:3.2-jdk-7 \
mvn clean install
टिप्पणियाँ:
- इस दृष्टिकोण के बारे में साफ बात यह है कि सभी सॉफ़्टवेयर कंटेनर के भीतर स्थापित और चल रहे हैं। मेजबान मशीन पर केवल डॉकटर की आवश्यकता है।
- इस संस्करण के लिए Dockerfile देखें
उदाहरण 2 - फ़ाइलों को कैश करने के लिए नेक्सस का उपयोग करें
Nexus कंटेनर चलाएँ
docker run -d -p 8081:8081 --name nexus sonatype/nexus
एक "settings.xml" फ़ाइल बनाएँ:
<settings>
<mirrors>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://nexus:8081/content/groups/public/</url>
</mirror>
</mirrors>
</settings>
अब मावेन को नेक्सस कंटेनर से जोड़कर चलाएं, ताकि निर्भरताएं खत्म हो जाएं
docker run -it --rm \
-v "$(pwd)":/opt/maven \
-w /opt/maven \
--link nexus:nexus \
maven:3.2-jdk-7 \
mvn -s settings.xml clean install
टिप्पणियाँ:
- नेक्सस को पृष्ठभूमि में चलाने का एक फायदा यह है कि अन्य 3 पार्टी रिपॉजिटरी को व्यवस्थापक URL के माध्यम से पारदर्शी रूप से स्थानीय कंटेनरों में चल रहे मावेन बिल्ड के लिए प्रबंधित किया जा सकता है।
mavenCentral()
अपनी श्रेणीबद्ध निर्भरता को बदल दिया हैmaven {url "http://nexus:8081..."
और अब केवल रिज़ॉल्यूशन समस्याएं हो रही हैं।