Как добавить дополнительные зависимости linux в образ buildpack с весенней загрузкой?

Я обновил свое приложение с весенней загрузкой, чтобы использовать пакеты сборки для создания образа докера вместо файла докера. Я также использую Apache POI в своем приложении, и после этого обновления я получаю сообщение об ошибке при создании файла xlsx. Покопавшись, я думаю, что это происходит потому, чтоfontconfig и / или ttf-dejavuпакеты отсутствуют. Но как мне добавить их в dockerimage? С помощью файла докеров я бы просто добавил что-то вроде

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

Но как добиться того же с помощью сборочных пакетов?

3 ответа

Решение

В этом ответе предполагается, что под "... приложением с весенней загрузкой для использования пакетов сборки" вы подразумеваете использование spring-boot:build-image цель maven.

Проблема заключается в построителе по умолчанию (gcr.io/paketo-buildpacks/builder:base), используемый плагином maven. Builder отвечает за настройку образа ОС, а "базовый" строитель не включаетfontconfigпакет..


Самый простой способ включить fontconfig пакет заключается в использовании "полного" построителя (gcr.io/paketo-buildpacks/builder:full-cf или gcr.io/paketo-buildpacks/builder:latest); Вы можете сделать это, например, одним из следующих способов:

  • указав параметр конфигурации построителя в плагине maven,

    <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,45 ГБ для "полного" против 644 МБ для "базового" - наблюдается в списке образов докеров), изрядно накладные расходы "только" для включения fontconfig.


Более сложный подход потребует создания настраиваемого компоновщика с настраиваемыми миксинами, чтобы создать настраиваемый "базовый" образ с дополнительными пакетами. Но мне лично было проще просто использовать подход dockerfile в этом сценарии. Некоторые статьи по созданию собственного конструктора:

Как отметил Михал, используя больший paketobuildpacks/builder:fullзастройщик не идеален. Кроме того, создание пользовательского компоновщика и стека было бы огромным накладным расходом, поскольку мы хотим использовать Cloud Native Buildpacks, чтобы освободить нас от бремени поддержки наших собственных пакетов . И создание нашего собственного компоновщика/стека привело бы к большей сложности, чем до написания кода. Dockerfile.

С другой стороны, необходимость установки отдельных пакетов в образы контейнеров , созданные spring-boot-maven-pluginили плагины Spring Boot Gradle широко распространены. Поэтому я подумал о минимально инвазивном решении - и вот оно ( ). Предположим, наш 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"

Идентификатор крабового контейнера остановленного контейнера с 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 cnbuser (и больше не используя root, чтобы избежать потенциальных угроз безопасности):

      docker run --rm -p 8080:8080 --user="cnb" --entrypoint /cnb/process/web my-app-with-fontconfig-ttf

Для получения более подробной справочной информации как получено изсм. это, поэтому ответьте также .

Я немного улучшу ответ от user4964553

Вместо того, чтобы бежать docker runвы можете создать новый Dockerfile, который будет использовать образ, созданный плагином 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
Другие вопросы по тегам