我正在使用 Spring Boot 内置的 Gradle
:bootBuildImage
任务构建我的 Docker 镜像,这非常方便,因为我不必维护自己的 Dockerfile
。
Gradle 任务在底层使用 Paketo Bionic Base Stack,并且可以很好地构建分层的 Docker 镜像。
现在,一些编排引擎,例如 Docker Swarm(或出于开发目的而简称为 Docker Compose),会在容器内执行运行状况检查。然而不幸的是,生成的 Spring Boot Docker 镜像没有安装任何健康检查工具,如 curl
或
wget
,所以类似于 version: '3.7'
services:
springBootApp:
image: my/springboot/docker-image
healthcheck:
test: ["CMD-SHELL", "curl http://localhost:8080/actuator/health"]
in
docker-compose.yml
将失败。 (我检查了执行器本身工作正常)
我知道curl
或
wget
并不理想。我实际上希望 Paketo Builder 能够选择这样的东西 Health Checker BuildPack。 有没有办法配置我的
bootBuildImage
Gradle 任务以包含该(或类似的)附加 BuildPack?
如上所述,我正在寻找一种易于维护的解决方案,并且不想编写自己的Dockerfile
以便能够从 Paketo 提供的所有最佳实践中获益。
使用说明
build.gradle
文件
:
tasks.named("bootBuildImage") {
environment["BP_HEALTH_CHECKER_ENABLED"] = "true"
buildpacks = ["urn:cnb:builder:paketo-buildpacks/java", "gcr.io/paketo-buildpacks/health-checker:latest"]
}
这将在构建时设置一个环境变量,指示健康检查器构建包参与。它还告诉 Spring Boot 构建工具将运行状况检查器构建包附加到默认情况下构建器中附带的 Java 构建包列表中。注意
您可能想要放入特定版本的健康检查器,这取决于您。它支持标准标签约定,例如 :1
、
:1.4
、:1.4.0
和 :latest
,因此您可以固定到最新的主要/次要版本或特定版本。注意./gradlew bootBuildImage
。您将看到检测中包含健康检查器构建包。
[creator] ===> DETECTING
[creator] 7 of 27 buildpacks participating
[creator] paketo-buildpacks/ca-certificates 3.6.0
[creator] paketo-buildpacks/bellsoft-liberica 10.0.0
[creator] paketo-buildpacks/syft 1.26.0
[creator] paketo-buildpacks/executable-jar 6.6.2
[creator] paketo-buildpacks/dist-zip 5.5.2
[creator] paketo-buildpacks/spring-boot 5.23.0
[creator] paketo-buildpacks/health-checker 1.3.1
...
。针对生成的图像运行 pack inspect <image>
。您可以看到健康检查器贡献了
health-check
流程类型。使用健康检查器构建包 v2,它不再提供进程类型,因为这导致了问题。
Processes:
TYPE SHELL COMMAND ARGS WORK DIR
web (default) java org.springframework.boot.loader.JarLauncher /workspace
executable-jar java org.springframework.boot.loader.JarLauncher /workspace
health-check thc /workspace
task java org.springframework.boot.loader.JarLauncher /workspace
docker run -d --health-cmd /cnb/process/health-check -p 8080:8080 -e THC_PATH=/actuator/health <image>
。
docker run -d --health-cmd /workspace/health-check -p 8080:8080 -e THC_PATH=/actuator/health <image>
。
。它还有其他可以配置的环境变量,但对于 Spring Boot 应用程序,您只需要设置执行器路径(除非您以不同方式设置管理端口,然后也设置 THC_PORT=<management-port>
。
./mvnw spring-boot:build-image
构建#2。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layers>
<enabled>true</enabled>
</layers>
<image>
<env>
<BP_HEALTH_CHECKER_ENABLED>true</BP_HEALTH_CHECKER_ENABLED>
</env>
<buildpacks>
<buildpack>urn:cnb:builder:paketo-buildpacks/java</buildpack>
<buildpack>gcr.io/paketo-buildpacks/health-checker:latest</buildpack>
</buildpacks>
</image>
</configuration>
</plugin>