如何使用 Gradle Kotlin DSL 对 Spring Boot 应用程序进行 Dockerize

Posted

技术标签:

【中文标题】如何使用 Gradle Kotlin DSL 对 Spring Boot 应用程序进行 Dockerize【英文标题】:How to Dockerize a Spring Boot application with Gradle Kotlin DSL 【发布时间】:2019-11-27 05:10:40 【问题描述】:

我正在关注Dockerize a Spring Boot application 的指南。关键是我正在使用 Gradle 的 Kotlin DSL,我无法将原始 Groovy 语法转换为 Kotlin。

这是指南中的原始 Groovy:

task unpack(type: Copy) 
    dependsOn bootJar
    from(zipTree(tasks.bootJar.outputs.files.singleFile))
    into("build/dependency")


docker 
    name "$project.group/$bootJar.baseName"
    copySpec.from(tasks.unpack.outputs).into("dependency")
    buildArgs(['DEPENDENCY': "dependency"])

这是我目前得到的 Kotlin:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins 
    id("org.springframework.boot") version "2.2.0.M4"
    id("io.spring.dependency-management") version "1.0.7.RELEASE"
    id("com.palantir.docker") version "0.22.1"
    kotlin("jvm") version "1.3.31"
    kotlin("plugin.spring") version "1.3.31"


group = "com.something"
version = "1.0.0-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_1_8

repositories 
    mavenCentral()


dependencies 
    implementation("org.springframework.boot:spring-boot-starter-webflux")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    // ...

【问题讨论】:

【参考方案1】:

如果你知道 jar 的路径,你不应该做副本......

configure<com.palantir.gradle.docker.DockerExtension> 
    dependsOn(tasks.findByPath("build"))
    name = "$project.name:$version"
    files("build/libs/$project.name-$version.jar")
    buildArgs(mapOf("JAR_FILE" to "$project.name-$version.jar"))

【讨论】:

【参考方案2】:

Yoni Gibbs 的回答提供了一个良好的开端,但这对我有用:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.springframework.boot.gradle.tasks.bundling.BootJar

plugins 
    id("org.springframework.boot") version "2.1.6.RELEASE"
    id("io.spring.dependency-management") version "1.0.7.RELEASE"
    kotlin("jvm") version "1.2.71"
    kotlin("plugin.spring") version "1.2.71"
    id("com.palantir.docker") version "0.22.1"


task<Copy>("unpack") 
    val bootJar = tasks.getByName<BootJar>("bootJar")
    dependsOn(bootJar)
    from(zipTree(bootJar.outputs.files.singleFile))
    into("build/dependency")


docker 
    val archiveBaseName = tasks.getByName<BootJar>("bootJar").archiveBaseName.get()
    name = "$project.group/$archiveBaseName"
    copySpec.from(tasks.getByName<Copy>("unpack").outputs).into("dependency")
    buildArgs(mapOf("DEPENDENCY" to "dependency"))

【讨论】:

【参考方案3】:

我还没有真正尝试过下面的,所以它可能需要一些调整,但我认为你需要的大致是这样的:

task<Copy>("unpack") 
    val bootJar = tasks.getByName<BootJar>("bootJar")
    dependsOn(bootJar)
    from(zipTree(bootJar.outputs.files))
    into("build/dependency")


docker 
    name = "$project.group/$tasks.getByName<BootJar>("bootJar").archiveBaseName"
    copySpec.from(tasks.getByName<Copy>("unpack").outputs).into("dependency")
    buildArgs(mapOf("DEPENDENCY" to "dependency"))

【讨论】:

以上是关于如何使用 Gradle Kotlin DSL 对 Spring Boot 应用程序进行 Dockerize的主要内容,如果未能解决你的问题,请参考以下文章

gradle kotlin dsl:如何创建使用插件类的共享函数?

Kotlin DSL 中的 gradle 额外属性是如何设置的?

如何将 Gradle 中的原生 JUnit 5 支持与 Kotlin DSL 结合使用?

如何从非 build-gradle 文件访问 Kotlin DSL 扩展?

使用 Gradle Kotlin DSL 配置 Jooq 时如何修复“未解析的引用:jdbc”

如何使用 kotlin dsl Gradle 将编译器参数传递给 java Compiler