すきま風

勉強したことのメモとか

ぼくのかんがえたさいきょうのJib

現時点で考えたさいきょうのJib設定をメモしておきます。1週間の勉強での結論なのですぐに変わりそうですが 😑
コード内の、どうすっかなーみたいなコメントでお察しください。
Jibの記事は一旦これで終了にする予定です。
いままでの記事と同じく、multi-project構成のSpring Boot Applicationを対象とします。前回、前々回を参照ください。JibのVersionは2.0.0を対象としています。

// build.gradle.kts
plugins {
    id("org.springframework.boot") version "2.3.0.M1" apply false
    id("io.spring.dependency-management") version "1.0.9.RELEASE"
    id("java")
    kotlin("jvm") version "1.3.61"
    kotlin("plugin.spring") version "1.3.61"
    // rootにはapply falseをつけて、main classがあるsubProjectに再度設定する
    id("com.google.cloud.tools.jib") version "2.0.0" apply false
}


// web/build.gradle.kts
import org.springframework.boot.gradle.tasks.bundling.BootJar

plugins {
    id("org.springframework.boot")
    id("io.spring.dependency-management")
    id("com.google.cloud.tools.jib")
}

dependencies {
    implementation(project(":docker-app-env"))
    implementation("org.springframework.boot:spring-boot-starter-webflux:2.3.0.M1")
}

tasks.getByName<BootJar>("bootJar") {
    mainClassName = "com.example.dockerapp.DockerAppApplicationKt"
}

jib {
    from {
        image = imageFrom()
    }
    to {
        image = imageTo()
    }

    // multi-projectの場合はFat Jarを利用する
    containerizingMode = "packaged"

    container {
        mainClass = "com.example.dockerapp.DockerAppApplicationKt"

        // どの環境でも設定する汎用的なpropertyはjvmFlagsに追加する
        // https://qiita.com/dmikurube/items/15899ec9de643e91497c   を参考にAsia/Tokyoをセット
        jvmFlags = listOf("-Dfile.encoding=UTF-8", "-Duser.timezone=Asia/Tokyo")

        ports = listOf("8080")

        // userを指定しない場合rootで動くので必ず指定する。uid:gid以外のセットでも指定できる。docker run 時の設定でもOK
        user = "1000:1000"

        // OCI formatで作成する
        format = com.google.cloud.tools.jib.api.ImageFormat.OCI

        // Setting image creation time to current time; your image may not be reproducible.
        // がメッセージとして出るので、creationTimeを設定するかは環境次第で決める
        creationTime = "USE_CURRENT_TIMESTAMP"

        // image作成時に追加でdirectoryを用意したい場合に設定
        // volumes = listOf("/var/log/dockerapp")
    }
}

// https://github.com/GoogleContainerTools/distroless/issues/214
// https://console.cloud.google.com/gcr/images/distroless/GLOBAL/java?gcrImageListsize=30
// Using base image with digest
fun imageFrom(): String {
    val profile = if (hasProperty("profile")) getProperty("profile") else ""

    return if ("development" == profile)
        // java:11-debug
        "gcr.io/distroless/java@sha256:e91e23383a8843a3f0bb00bdf99b9b7bed8c7ce25ed929acbe0eedec70fa91f9"
    else
        // java:11
        "gcr.io/distroless/java@sha256:0ce06c40e99e0dce26bdbcec30afe7a890a57bbd250777bd31ff2d1b798c7809"
}

fun imageTo() =
    getProperty("registry") + "/" + getProperty("artifactid") + ":" + getProperty("version")

fun getProperty(value: String) = findProperty(value) as String
// debug imageを使う場合developmentを指定する
$ ./gradlew jibDockerBuild -Pprofile=development

// jvmFlagsが設定されている 😊
Container entrypoint set to [java, -Dfile.encoding=UTF-8, -Duser.timezone=Asia/Tokyo, -cp, /app/classpath/*:/app/libs/*, com.example.dockerapp.DockerAppApplicationKt]

// 実行環境によって異なるpropertyはJAVA_TOOL_OPTIONSで設定する
$ docker run -p 8080:8080 -e "JAVA_TOOL_OPTIONS=-Dspring.profiles.active=development -Xms1G -Xmx1G" --rm jib/dockerapp:0.0.1-SNAPSHOT

// JAVA_TOOL_OPTIONSをひろってくれる (Logをだしてくれる。親切 😊)
Picked up JAVA_TOOL_OPTIONS: -Dspring.profiles.active=development -Xms1G -Xmx1G

あとはApplicationの必要に応じてenvironmentやargsを設定する感じになります。
運用がガラッと変わったらまた記事にします。さよならバイバイ(^_^)/~