Docker وKotlin: حاويات التطبيقات من الألف إلى الياء
أصبحت الحاويات المعيار الفعلي للتطوير الحديث. فهي تحل مشكلة "يعمل على جهازي" وتُبسّط CI/CD. في هذه المقالة، سنشرح كيفية حاوية تطبيقات Kotlin بكفاءة باستخدام Docker - بدءًا من إنشاء Dockerfile بسيط وصولاً إلى تحسينات الإنتاج والتنسيق.
1. الأساسيات: Dockerfile لتطبيق Kotlin
قلب الحاويات هو Dockerfile. بالنسبة لتطبيقات Kotlin التي تُترجم إلى bytecode JVM، نستخدم البناء متعدد المراحل (multi-stage build). وهذا يسمح بفصل بيئة البناء عن بيئة التشغيل، مما يقلل حجم الصورة النهائية.
لننظر إلى تطبيق نموذجي على Kotlin باستخدام Gradle (ملف build.gradle.kts مبسط):
// build.gradle.ktsplugins { kotlin("jvm") version "1.9.0" application id("com.google.cloud.tools.jib") version "3.4.0" // اختياري}
application { mainClass.set("com.example.MainKt")}لننشئ Dockerfile بمرحلتين:
# المرحلة 1: البناءFROM gradle:8.5-jdk21 AS builderWORKDIR /appCOPY build.gradle.kts settings.gradle.kts ./COPY gradle ./gradleCOPY src ./srcRUN gradle build --no-daemon
# المرحلة 2: التشغيلFROM eclipse-temurin:21-jre-alpineWORKDIR /appCOPY --from=builder /app/build/libs/my-app-*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]أوامر البناء والتشغيل:
docker build -t my-kotlin-app .docker run -p 8080:8080 my-kotlin-appالتوصيات:
- استخدم
eclipse-temurin(OpenJDK) بدلاً من JDK الكامل - الصورة أصغر. - خزّن التبعيات مؤقتًا: انسخ
build.gradle.ktsأولاً، ثمsrc. - لتطبيقات Spring Boot، يمكن استخدام
layersللبناء التدريجي.
2. التحسين باستخدام Jib وGradle
كتابة Dockerfile يدويًا هي الطريقة التقليدية، لكن هناك أدوات تؤتمت العملية. Jib (من Google) يتكامل مع Maven/Gradle ويبني صور Docker محسّنة دون الحاجة إلى Docker daemon.
أضف إضافة Jib إلى build.gradle.kts:
plugins { id("com.google.cloud.tools.jib") version "3.4.0"}
jib { from { image = "eclipse-temurin:21-jre-alpine" } to { image = "my-registry/my-kotlin-app:latest" } container { ports = listOf("8080") jvmFlags = listOf("-Xms512m", "-Xmx1024m") }}البناء بأمر واحد:
./gradlew jibDockerBuildمزايا Jib:
- تقسيم تلقائي إلى طبقات (تبعيات، موارد، فئات).
- لا يتطلب Dockerfile.
- يعمل بدون Docker daemon - مثالي لـ CI/CD.
مثال لتطبيق Kotlin (خادم HTTP بسيط):
// src/main/kotlin/com/example/Main.ktpackage com.example
import com.sun.net.httpserver.HttpServerimport java.net.InetSocketAddress
fun main() { val server = HttpServer.create(InetSocketAddress(8080), 0) server.createContext("/") { exchange -> val response = "Hello from Kotlin in Docker!" exchange.sendResponseHeaders(200, response.length.toLong()) exchange.responseBody.write(response.toByteArray()) exchange.close() } server.start() println("Server started on port 8080")}3. Docker Compose: تطبيقات متعددة الحاويات
نادرًا ما تتكون المشاريع الحقيقية من خدمة واحدة. Docker Compose يسمح بوصف وتشغيل عدة حاويات (مثل: تطبيق + قاعدة بيانات + Redis).
لننشئ docker-compose.yml لتطبيق Kotlin مع PostgreSQL:<