将 spring-actuator 与 Spring-Boot 默认 Docker-Image 构建器一起使用

问题描述

我在由 docker-compose.yml 文件管理并使用 portainer 进行可视化的 Docker 环境中使用 Spring-Boot 2.4.4。我正在使用 Spring-Boot 内置构建器(使用 paketo-buildpacks)构建我的 Docker 镜像

mvn spring-boot:build-image

我想用 spring-actuator 监控我的 Docker 容器。所以我添加了 maven 依赖项,当我在本地运行我的应用程序并访问特定页面时,我得到了想要的结果:

http://localhost:8080/actuator/health

由于我使用的是 Spring-Boot 内置 Docker 映像生成器,因此我没有 Dockerfile 来添加健康点。当我在 docker-compose.yml 中添加 healtheck 时,找不到 wget 命令:

    healthcheck:
      test: wget --spider --quiet 'http://localhost:8080/actuator/health/' || exit 1
      interval: 10s
      timeout: 3s
      retries: 10
      start_period: 10s

我做错了什么?我在网上找不到任何文档。我认为 Spring-Boot 能够自行检测弹簧执行器,但我认为它没有。

解决方法

用于运行 Spring Boot 应用程序的基本映像中不包含 wgetcurl 命令。也许您可以挂载另一个实用程序卷:https://stackoverflow.com/a/65854305/8335251

或者,只需编写另一个用于请求健康执行器的轻量级 Java 应用程序,将结果映射到退出代码中。然后打包成jar,基于Spring Boot应用镜像用jar包构建另一个镜像。之后,可以使用 java -jar 命令运行健康检查。

,

您可以切换打包容器镜像时使用的构建器。请参阅image customization settings here

默认构建器是 paketobuildpacks/builder:base,它的运行映像不包含 curlwget。您可以将构建器切换到 paketobuildpacks/builder:full,并且您应该拥有 curl(也可能是 wget,我不确定我的想法)。

这里的权衡是运行映像更大,因此您构建的映像的大小会增加。完整图像有相当多的内容和权重,大约为 1G,而基本图像大约为 100M。

Docker 在下载层方面很聪明,所以如果你有 50 个基于同一个完整构建器映像的应用程序,它不会导致下载 50G。 Docker(和其他容器运行时)只下载它没有的层,所以额外的演出基本上是一次性下载的。最终,您必须确定拥有 curl 的便利是否值得在图像中增加额外的尺寸。