Docker 与 Kotlin:面向开发者的应用容器化

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程
```html

Docker 和 Kotlin:应用程序容器化



现代 Kotlin 开发越来越需要容器化。Docker 允许将应用程序及其所有依赖项打包到隔离环境中,从而确保在开发者的本地机器、测试服务器和生产环境中行为一致。在本文中,我们将探讨如何使用最佳实践和代码示例正确地对 Kotlin 项目进行容器化。



为什么要容器化 Kotlin 应用程序?



Kotlin 运行在 JVM 之上,因此基于 Kotlin 的应用程序继承了 Java 生态系统的所有特性。容器化的主要优势包括:



  • 环境可重现性 — 避免“在我的机器上能运行”的问题。
  • 依赖隔离 — JDK 版本、库和系统工具的版本在镜像中固定。
  • 可扩展性 — 容器可以轻松部署到 Kubernetes 和其他编排器中。
  • 快速部署 — Docker 镜像比虚拟机更小。


为 Kotlin 应用程序创建 Dockerfile



考虑一个使用 Gradle 的典型 Kotlin 项目。我们的 build.gradle.kts 可能如下所示:



plugins {    kotlin("jvm") version "1.9.22"    application}

application { mainClass.set("com.example.MainKt")}

dependencies { implementation(kotlin("stdlib")) // 其他依赖项}


现在让我们创建一个 Dockerfile。第一个选项是多阶段构建,它将编译阶段与运行阶段分开:



# 构建阶段FROM gradle:8.5-jdk21 AS buildCOPY --chown=gradle:gradle . /home/gradle/srcWORKDIR /home/gradle/srcRUN gradle build --no-daemon

# 运行阶段FROM eclipse-temurin:21-jre-alpineWORKDIR /appCOPY --from=build /home/gradle/src/build/libs/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]


让我们分析关键点:



  • gradle:8.5-jdk21 — 用于构建的官方 Gradle 和 JDK 镜像。
  • eclipse-temurin:21-jre-alpine — 基于 Alpine Linux 的轻量级 JRE 镜像(约 80 MB)。
  • COPY --from=build — 仅复制构建好的 JAR,排除源代码和 Gradle 缓存。
  • EXPOSE 8080 — 文档化端口(不会自动打开它)。


要构建镜像,请运行:



docker build -t kotlin-app:latest .docker run -p 8080:8080 kotlin-app:latest


优化镜像大小



镜像大小对于部署速度至关重要。以下是针对 Kotlin 应用程序的一些技巧:



1. 使用 jlink 创建自定义 JRE



如果您的应用程序未使用所有 JDK 模块,您可以创建一个最小的 JRE:



# 构建阶段FROM gradle:8.5-jdk21 AS buildCOPY . /appWORKDIR /appRUN gradle build --no-daemon

# 创建自定义 JRE 的阶段FROM eclipse-temurin:21-jdk-alpine AS jre-builderRUN jlink \ --add-modules java.base,java.logging,java.naming,java.sql \ --strip-debug \ --no-man-pages \ --no-header-files \ --compress=2 \ --output /jre

# 最终阶段FROM alpine:3.19ENV JAVA_HOME=/jreENV PATH="${JAVA_HOME}/bin:${PATH}"COPY --from=jre-builder /jre /jreCOPY --from=build /app/build/libs/*.jar /app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "/app.jar"]


这种方法将镜像大小从约 200 MB 减少到约 40-50 MB。



2. 使用 Spring Boot layertools



对于基于 Spring Boot(使用 Kotlin)的项目,您可以将 JAR 拆分为层以利用 Docker 缓存:



# build.gradle.ktstasks.bootJar {    layered {        enabled = true    }}


在 Dockerfile 中,分别复制各层,

```

博客

书籍推荐