Привет! На связи Александр Бархатов — DevOps-инженер в крупнейшем продуктовом холдинге и автор статей в медиа вАЙТИ. Самое популярное средство для сборки контейнеризированного приложения — это Dockerfile, текстовый файл, в котором прописаны специальные инструкции для готовых Docker-образов. Несмотря на всеобщую популярность Docker, в 2011 году вышел инструмент под названием Buildpacks, принцип работы которого мы рассмотрим в этой статье.

Используем Buildpacks вместо Dockerfile
Используем Buildpacks вместо Dockerfile

Описание Buildpacks

Buildpacks в 2011 году разработала компания Heroku, предоставляющая облачную PaaS-платформу для развертывания веб-приложений на различных языках программирования. Начиная с 2018 года Buildpacks принадлежит некоммерческому проекту CNCF (Cloud Native Computing Foundation), который занимается развитием и поддержкой контейнерных технологий, а также разрабатывает различное программное обеспечение с открытым исходным кодом для Linux и DevOps-отрасли.

Идея Buildpacks заключается в максимальной автоматизации сборки образов из исходных кодов приложений. В отличие от Docker Buildpacks не использует в своей работе такую сущность, как Dockerfile. Чтобы собрать образ приложения, достаточно лишь запустить команду сборки. Иными словами, Buildpacks преобразует исходный код приложения в доступный для запуска образ контейнера. Готовый образ запускается при помощи Docker или Podman.

Принцип работы Buildpacks
Принцип работы Buildpacks

Buildpacks поддерживает работу с языками программирования Ruby, Python, Node. js, PHP, Go, Java и Scala.

Buildpacks работает в два этапа — обнаружение и сборка.

На этапе обнаружения Buildpack определяет используемый язык программирования и проверяет, можно ли начать сборку приложения из исходных файлов. Например, для языка программирования Python будет запущен поиск таких файлов, как requirements.txt или setup.py. Для фреймворка Node — поиск файла package-lock.json.

На этапе сборки Buildpack применяет конфигурационные файлы приложения, скачивает зависимости, компилирует исходный код, настраивает параметры запуска и так далее. Например, на этом этапе происходит установка зависимостей, которые указаны в файле requirements.txt для приложений на языке Python.

Используем Buildpacks для сборки контейнеризированного образа

Рассмотрим применение Buildpacks на практическом примере. Для теста воспользуемся ОС Linux, а именно Ubuntu версии 22.04.

1. Установим Docker. Инструкция по установке на дистрибутиве Ubuntu приведена на официальном сайте Docker и доступа по ссылке.

2. Теперь установим Buildpacks из официального репозитория программы:

add-apt-repository ppa:cncf-buildpacks/pack-cli
apt -y install pack-cli

После завершения установки выведем справочную информацию. Это покажет, корректно ли прошла установка:

pack --help

Buildpacks успешно установлен

3. Воспользуемся тестовым приложением на языке Java из репозитория  GitHub. Клонируем репозиторий при помощи git clone и переходим в скачанную директорию с кодом проекта на Java:

git clone https://github.com/buildpacks/samples && cd samples/apps/java-maven

4. Для сборки образа выполняем единственную команду:

pack build myapp --builder cnbs/sample-builder:jammy

Создание образа может занять пару минут или больше, особенно если процесс запущен впервые, потому что утилита скачивает необходимые зависимости.

5. Когда сборка завершится, можно запустить готовый образ. Используем Docker при помощи команды:

docker run --rm -p 8080:8080 myapp

Открываем браузер и переходим по адресу сервера, используя порт 8080, чтобы открыть наше веб-приложение:

Приложение успешно запущено

В этой статье мы рассмотрели утилиту Buildpacks, которую можно использовать вместо Dockerfile. Она значительно ускоряет и упрощает процесс создания образов контейнеризированных приложений. С момента появления утилиты у нее значительно расширился список поддерживаемых языков программирования, а также функционал.

вАЙТИ — DIY-медиа для ИТ-специалистов. Делитесь личными историями про решение самых разных ИТ-задач и получайте вознаграждение.

Еще больше статей по теме

Как использовать Ansible для простых и сложных задач
Автоматизируем мелкую повседневную рутину и раскатку инфраструктурных компонентов.

Используем Fail2ban для защиты SSH
Рассказываю, как установить и настроить Fail2ban для защиты SSH от сетевых угроз.

Обзор Snort для обнаружения вторжений
Как использовать Snort для обнаружения и анализа подозрительного трафика.

Комментарии (7)


  1. Kozoft
    11.10.2024 13:25

    Как кастомизировать сборку? Файликов докинуть в контейнер, пользователя там создать, запустить от него что-нибудь, entrypoint поменять, порты дополнительно выставить? Это в buildpacks есть?


  1. edo1h
    11.10.2024 13:25

    По прочтению так и не понял главного: зачем


  1. Teapot
    11.10.2024 13:25

    Так вы используете билдпаки в beeline cloud?


  1. powernic
    11.10.2024 13:25

    Судя по скриншотам, он просто скачивает какой-то готовый образ и переименовывает его? Где сам процесс сборки? Что он вообще может кроме использования готовых образов?


  1. Ale2Da
    11.10.2024 13:25

    А Вы ее использовали сами на каком либо, отличном от sample образе ?
    Вопросы, которые остались за рамками изложенного.
    1. Как выбирать builder из предложенных?
    2. Как оптимизивать образ по размеру ?
    3. Как управлять процессом, если он хоть чуть отличается от самого простого sample, например для rails приложения, где кроме ruby есть еще JS зависимости.


  1. devslm
    11.10.2024 13:25

    Есть вопросы по сборке java - он просто jar’ку собирает и запаковывает? Тогда это не совсем правильный способ.

    Жаль, что в статье очень много не затронутых важных вопросов, хотя бы про то, можно ли делать дополнительны кастомизации и как? И будет ли в этом случае реальный профит в сравнении с обычным dockerfile’ом.


  1. para_u
    11.10.2024 13:25

    окэ, оно интергируется в этап "сборка исходников"

    а если мне нужно дополнительно настроить окружение, что не делается программно из приложения? например: шрифты, сертификаты, всякие oracle instant client...