8

我更新了我的 spring-boot 应用程序以使用 buildpacks 来创建我的 docker-image 而不是 dockerfile。我还在我的应用程序中使用 Apache POI,并且由于该更新,我在生成 xlsx 文件时出现错误。经过一番挖掘,我认为这是因为缺少fontconfigand/orttf-dejavu包。但是如何在 dockerimage 中添加这些?使用 dockerfile 我只需添加类似

RUN apt-get update && apt-get install fontconfig ttf-dejavu

但是如何使用 buildpacks 实现相同的目标?

4

3 回答 3

6

这个答案假设“... spring-boot application to use buildpacks”是指使用spring-boot:build-imagemaven 目标。

gcr.io/paketo-buildpacks/builder:base问题在于maven 插件使用的默认构建器 ( )。Builder 负责配置 OS 映像,“base”builder 不包含fontconfig包。.


启用fontconfig包的最简单方法是使用“完整”构建器(gcr.io/paketo-buildpacks/builder:full-cfgcr.io/paketo-buildpacks/builder:latest);例如,您可以通过以下方式之一这样做:

  • 通过在 maven 插件中指定 builder 配置参数,

    <project>
    <build>
       <plugins>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
               <version>2.3.3.BUILD-SNAPSHOT</version>
               <configuration>
                   <image>
                       <builder>gcr.io/paketo-buildpacks/builder:latest</builder>
                   </image>
               </configuration>
           </plugin>
       </plugins>
    </build>
    </project>
    
  • 或直接在mvn命令行上添加-Dspring-boot.build-image.builder=gcr.io/paketo-buildpacks/builder:latest.

但是,这并不理想,因为完整的操作系统映像要大得多(“完整”大约为 1.45GB,“基本”大约为 644MB - 在 docker 映像列表中观察到),启用fontconfig.


一个更复杂的方法需要创建一个带有自定义 mixin 的自定义构建器,以便使用额外的包创建一个定制的“基础”图像。但我个人发现在这种情况下使用 dockerfile 方法更容易。关于创建自定义构建器的一些文章:

于 2020-08-09T01:45:26.047 回答
2

正如 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…&quot;   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也

于 2020-12-21T13:56:09.977 回答
0

我会稍微改进jonashackt的回答。

您可以创建新的 Dockerfile,而不是运行docker run,它将使用 Spring Boot 插件生成的图像作为基础图像。

例如:

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <configuration>
    <image>
      <name>acme.com/artifact:boot</name>
    </image>
  </configuration>
</plugin>

然后在你的 Dockerfile

FROM acme.com/artifact:boot

USER root
RUN apt-get update && apt-get install -y fontconfig ttf-dejavu
于 2022-01-26T05:17:40.343 回答