Search code examples
spring-bootdockergradlekotlingradle-kotlin-dsl

How to Dockerize a Spring Boot application with Gradle Kotlin DSL


I am following this guide to Dockerize a Spring Boot application. The point is I am using Gradle's Kotlin DSL and I'm having trouble converting the original Groovy syntax to Kotlin.

This is the original Groovy from the guide:

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"])
}

This is the Kotlin I have got so far:

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")
    // ...
}

Solution

  • The answer from Yoni Gibbs provides a good start, but this is what worked for me:

    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"))
    }