Docker और Kotlin: उन्नत स्तर पर अनुप्रयोगों का कंटेनरीकरण
\n\nकंटेनरीकरण आधुनिक विकास का एक अभिन्न अंग बन गया है, और Kotlin कोई अपवाद नहीं है। यदि आपने पहले से ही बुनियादी Dockerfile और सरल JAR फ़ाइलों को चलाने में महारत हासिल कर ली है, तो अब अगले स्तर पर जाने का समय आ गया है। इस लेख में, हम Kotlin अनुप्रयोगों के कंटेनरीकरण की उन्नत तकनीकों पर विचार करेंगे: मल्टी-स्टेज बिल्ड, इमेज आकार का अनुकूलन, Ktor और Spring Boot फ्रेमवर्क के लिए कॉन्फ़िगरेशन, और प्रोडक्शन वातावरण में Docker Compose के साथ कार्य करना।
\n\n1. Kotlin अनुप्रयोगों का मल्टी-स्टेज बिल्ड
\n\nJVM अनुप्रयोगों को कंटेनरीकृत करने में मुख्य समस्याओं में से एक अंतिम इमेज का आकार है। मानक OpenJDK इमेज का वजन 400 MB से अधिक हो सकता है। मल्टी-स्टेज बिल्ड आपको बिल्ड वातावरण को रनटाइम वातावरण से अलग करने की अनुमति देता है, जिसमें न्यूनतम रनटाइम इमेज का उपयोग किया जाता है।
\n\nKotlin पर Gradle प्रोजेक्ट के लिए उदाहरण
\n\n# पहला चरण: बिल्ड\nFROM gradle:8.5-jdk21 AS builder\nWORKDIR /app\nCOPY build.gradle.kts settings.gradle.kts ./\nCOPY src ./src\nRUN gradle build --no-daemon -x test\n\n# दूसरा चरण: निष्पादन\nFROM eclipse-temurin:21-jre-alpine\nWORKDIR /app\nCOPY --from=builder /app/build/libs/app.jar app.jar\nEXPOSE 8080\nENTRYPOINT ["java", "-jar", "app.jar"]\n\nपूर्ण JDK इमेज के बजाय eclipse-temurin:21-jre-alpine का उपयोग करने से आकार 400+ MB से घटकर ~120 MB हो जाता है। Ktor या Spring Boot पर Kotlin अनुप्रयोगों के लिए यह पर्याप्त से अधिक है।
लेयर कैशिंग का अनुकूलन
\n\nपुनरावृत्त बिल्ड को गति देने के लिए, निर्भरताओं को स्रोत कोड से अलग कॉपी करें:
\n\nFROM gradle:8.5-jdk21 AS builder\nWORKDIR /app\n# पहले निर्भरताएँ (यदि नहीं बदली हैं तो कैश हो जाती हैं)\nCOPY build.gradle.kts settings.gradle.kts ./\nRUN gradle dependencies --no-daemon\n# फिर स्रोत\nCOPY src ./src\nRUN gradle build --no-daemon -x test\n\nयह तकनीक CI/CD में विशेष रूप से उपयोगी है, जहाँ हर सेकंड मायने रखता है।
\n\n2. Kotlin अनुप्रयोगों के लिए इमेज का अनुकूलन
\n\nबेस इमेज चुनने के अलावा, आकार कम करने और सुरक्षा बढ़ाने के लिए अतिरिक्त तकनीकें मौजूद हैं।
\n\nकस्टम JRE बनाने के लिए JLink का उपयोग
\n\nयदि आपका एप्लिकेशन JDK मॉड्यूल के केवल एक भाग का उपयोग करता है, तो आप न्यूनतम JRE बना सकते हैं:
\n\n# बिल्डर चरण में\nRUN jlink --module-path /opt/java/openjdk/jmods \\\n --add-modules java.base,java.logging,java.naming,java.sql \\\n --output /custom-jre \\\n --strip-debug --no-man-pages --no-header-files\n\n# रनटाइम चरण में\nFROM alpine:3.19\nCOPY --from=builder /custom-jre /opt/jre\nCOPY --from=builder /app/build/libs/app.jar /app/app.jar\nENV PATH="/opt/jre/bin:${PATH}"\nEXPOSE 8080\nCMD ["java", "-jar", "/app/app.jar"]\n\nइमेज का आकार घटकर 50-70 MB हो सकता है।
\n\nSpring Boot के साथ मल्टी-लेयर आर्किटेक्चर
\n\nSpring Boot 3+ fat JAR को लेयर में विभाजित करने का समर्थन करता है। Dockerfile में इसका उपयोग करें:
\n\nFROM eclipse-temurin:21-jre-alpine AS builder\nWORKDIR /app\nCOPY build/libs/*.jar app.jar\nRUN java -Djarmode=layertools -jar app.jar extract\n\nFROM eclipse-temurin:21-jre-alpine\nWORKDIR /app\nCOPY --from=builder /app/dependencies/ ./\nCOPY --from=builder /app/spring-boot-loader/ ./\nCOPY --from=builder /app/snapshot-dependencies/ ./\nCOPY --from=builder /app/application/ ./\nENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"]\n\nअब कोड बदलने पर केवल application लेयर पुनः बिल्ड होती है, जबकि निर्भरताएँ और Spring Boot loader कैश्ड रहते हैं।
3. Ktor अनुप्रयोगों का कंटेनरीकरण
\n\nKtor Kotlin पर एसिंक्रोनस सर्वर बनाने के लिए एक हल्का फ्रेमवर्क है। इसके कंटेनरीकरण की अपनी विशेषताएँ हैं।
\n\nNetty के साथ Ktor के लिए Dockerfile
\n\nFROM gradle:8.5-jdk21 AS builder\nWORKDIR /app\nCOPY build.gradle.kts settings.gradle.kts ./\nRUN gradle dependencies --