正如 Michal 所述,使用更大的 paketobuildpacks/builder:full 构建器并不理想。此外,创建自定义构建器和堆栈将是一个巨大的开销 - 因为我们希望使用 Cloud Native Buildpacks 来让我们摆脱维护自己的 Dockerfile 的负担。并且创建我们自己的构建器/堆栈会带来比我们在编写 Dockerfile 之前更复杂的方式。
另一方面,由spring-boot-maven-plugin 或Spring Boot Gradle 插件创建的the need to install separate packages into the container images 很普遍。所以我想到了一种微创解决方案——这就是 (as derived from)。假设我们的 mvn spring-boot:build-image(或 Gradle buildImage)命令生成了一个名为 my-app:0.0.1-SNAPSHOT 的容器镜像:
现在首先将fontconfig ttf-dejavu 安装到镜像中(我们需要root 权限):
docker run --user="root" --entrypoint launcher my-app:0.0.1-SNAPSHOT "apt-get update && apt-get install fontconfig ttf-dejavu -y"
已停止容器的 Crab 容器 ID 为 docker ps -a:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2ff7db32825f my-app:0.0.1-SNAPSHOT "launcher 'apt-get u…" 44 minutes ago Exited (0) 44 minutes ago reverent_swanson
Create a new container image based on the one 我们将curl 安装到:
docker commit 2ff7db32825f my-app-with-fontconfig-ttf
启动一个定义正确 ENTRYPOINT 的新容器以启动 Spring Boot 应用程序并切换回 CNB 的标准 cnb 用户(不再使用 root 以避免潜在的安全风险):
docker run --rm -p 8080:8080 --user="cnb" --entrypoint /cnb/process/web my-app-with-fontconfig-ttf
如需更详细的背景信息see this so answer also。