You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Boot bootBuildImage(Paketo构建)镜像中添加curl

问题:Spring Boot bootBuildImage构建镜像缺少curl导致Kamal健康检查失败

需要构建包含curl和/bin/sh的Spring Boot应用镜像,用于Kamal部署工具的健康检查。基于amazoncorretto:23的Dockerfile构建镜像可正常工作(自带curl),但bootBuildImage生成的轻量化镜像(仅200MB,比Dockerfile构建的300MB小)因缺少curl部署失败,需自定义bootBuildImage任务添加curl。

现有Dockerfile

FROM amazoncorretto:23
WORKDIR /app
COPY customerservice/build/libs/A-0.0.1.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

现有Gradle bootBuildImage任务

// creates smaller docker images, buildpacks
tasks.named<org.springframework.boot.gradle.tasks.bundling.BootBuildImage>("bootBuildImage") {
    imageName.set("U/A:latest")
    publish.set(true)
    docker {
        publishRegistry {
            username = "U"
            password = System.getenv("DOCKER_REGISTRY_TOKEN")
        }
    }
    builder= "paketobuildpacks/builder-jammy-full:latest"
    environment.set(
        mapOf(
            "BP_IMAGE_LABELS" to "service=\"A\"",
            "BP_JVM_VERSION" to "23",
        )
    )
}

已尝试方案

  • 查找可添加内容的环境变量,未找到有效配置
  • 使用paketobuildpacks/builder-jammy-full:latest构建器,误以为最终镜像包含curl,实际没有
  • 设置runImage.set("amazoncorretto:23"),部署仍然失败

解决方法

方法1:通过环境变量安装系统包

Paketo Buildpacks支持通过BP_SYSTEM_PACKAGES环境变量指定要安装的额外系统包,直接在bootBuildImage的环境配置中添加即可:

tasks.named<org.springframework.boot.gradle.tasks.bundling.BootBuildImage>("bootBuildImage") {
    imageName.set("U/A:latest")
    publish.set(true)
    docker {
        publishRegistry {
            username = "U"
            password = System.getenv("DOCKER_REGISTRY_TOKEN")
        }
    }
    builder= "paketobuildpacks/builder-jammy-full:latest"
    environment.set(
        mapOf(
            "BP_IMAGE_LABELS" to "service=\"A\"",
            "BP_JVM_VERSION" to "23",
            "BP_SYSTEM_PACKAGES" to "curl" // 新增:安装curl及依赖的基础环境
        )
    )
}

该配置会让Buildpack在构建过程中自动安装curl,同时/bin/sh这类基础shell环境也会被包含,满足Kamal健康检查需求。

方法2:指定自带curl的运行镜像

若方法1不生效,可直接指定自带curl的运行镜像(如amazoncorretto:23),需搭配兼容的构建器:

tasks.named<org.springframework.boot.gradle.tasks.bundling.BootBuildImage>("bootBuildImage") {
    imageName.set("U/A:latest")
    publish.set(true)
    docker {
        publishRegistry {
            username = "U"
            password = System.getenv("DOCKER_REGISTRY_TOKEN")
        }
    }
    builder.set("paketobuildpacks/builder-jammy-base:latest") // 选择兼容基础构建器
    runImage.set("amazoncorretto:23") // 指定自带curl的运行镜像
    environment.set(
        mapOf(
            "BP_IMAGE_LABELS" to "service=\"A\"",
            "BP_JVM_VERSION" to "23",
        )
    )
}

注意构建器与运行镜像的系统版本需匹配(这里jammy对应Ubuntu 22.04,amazoncorretto:23基于Ubuntu,版本兼容)。


内容的提问来源于stack exchange,提问作者pleasebenice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 06:45:14