正如 Michal 所述,使用更大的paketobuildpacks/builder:full
构建器并不理想。同样创建自定义构建器和堆栈将是一个巨大的开销 - 因为我们想使用 Cloud Native Buildpacks 来让我们摆脱维护自己的负担Dockerfile
。并且创建我们自己的构建器/堆栈会带来比我们在编写Dockerfile
.
另一方面,将单独的包安装到由 Spring Boot Gradle 插件或 Spring Boot Gradle 插件创建的容器镜像中的需求spring-boot-maven-plugin
很普遍。所以我想到了一种微创解决方案——它就是这样(源自)。假设我们的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
根据我们安装的镜像创建一个新的容器镜像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
有关更详细的背景信息,请参见this so answer也。