Как добавить дополнительные зависимости 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
cnb
user (и больше не используя 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