如何在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
相关产品推荐
相关产品推荐

