Skip to content

Instantly share code, notes, and snippets.

@azalio
Last active May 13, 2021 13:18
Show Gist options
  • Save azalio/ce134ebb6cb73210897adf7459cd7422 to your computer and use it in GitHub Desktop.
Save azalio/ce134ebb6cb73210897adf7459cd7422 to your computer and use it in GitHub Desktop.
# Buildpack
Потестил создание docker образа из исходников ruby с помощью своего билда.
=====================
Небольшое отступление.
Вам в обычной жизни не надо этим заморачиваться, уже создано большое количество билдпаков, которые сами разберутся как собрать образ вашего приложения.
https://devcenter.heroku.com/articles/buildpacks#officially-supported-buildpacks
https://elements.heroku.com/buildpacks (7741 Buildpacks)
Вот, например, как я собрал свое приложение на Golang
Склонировал репозиторий
git clone https://github.com/azalio/dnsapi.git
Посмотрел что советует pack
```
➜ dnsapi git:(master) pack builder suggest
Suggested builders:
Google: gcr.io/buildpacks/builder:v1 Ubuntu 18 base image with buildpacks for .NET, Go, Java, Node.js, and Python
Heroku: heroku/buildpacks:18 Base builder for Heroku-18 stack, based on ubuntu:18.04 base image
Paketo Buildpacks: paketobuildpacks/builder:base Ubuntu bionic base image with buildpacks for Java, .NET Core, NodeJS, Go, Ruby, NGINX and Procfile
Paketo Buildpacks: paketobuildpacks/builder:full Ubuntu bionic base image with buildpacks for Java, .NET Core, NodeJS, Go, PHP, Ruby, Apache HTTPD, NGINX and Procfile
Paketo Buildpacks: paketobuildpacks/builder:tiny Tiny base image (bionic build image, distroless-like run image) with buildpacks for Java Native Image and Go
```
Собрал образ
```
pack build dnsapi --builder gcr.io/buildpacks/builder:v1
```
Все, приложение запускается и работает.
=====================
https://github.com/azalio/buildpack-test
Делалось по этому туториалу
https://buildpacks.io/docs/buildpack-author-guide/create-buildpack/
Само руби приложение
https://github.com/azalio/buildpack-test/tree/master/ruby-sample-app
Для того чтобы собрать докер образ без Dockerfile вам надо создать три файла
https://github.com/azalio/buildpack-test/blob/master/ruby-buildpack/buildpack.toml
Описание нашего buildpack - https://buildpacks.io/docs/concepts/components/buildpack/
https://github.com/azalio/buildpack-test/blob/master/ruby-buildpack/bin/detect
отвечает за то, что при поиске кандидата на сборку приложения будет выбран этот билдпак.
Тут просто смотрит на наличие Gemfile
https://github.com/azalio/buildpack-test/blob/master/ruby-buildpack/bin/detect#L4
```
if [[ ! -f Gemfile ]]; then
exit 100
fi
```
Логика ниже позволяет указать с какой версией руби работает ваше приложение.
https://github.com/azalio/buildpack-test/blob/master/ruby-buildpack/bin/detect#L12
Файл проверяется в исходниках приложения
https://github.com/azalio/buildpack-test/blob/master/ruby-sample-app/.ruby-version
Если запустить тестовую сборку
pack build test-ruby-app --path ./ruby-sample-app --buildpack ./ruby-buildpack
То увидим следующее
```
===> DETECTING
[detector] examples/ruby 0.0.1
```
За сборку приложения отвечает файл
https://github.com/azalio/buildpack-test/blob/master/ruby-buildpack/bin/build
Вся основная работа начинается со скачивания руби
https://github.com/azalio/buildpack-test/blob/master/ruby-buildpack/bin/build#L16
Тут мы говорим что хотим иметь руби при запуске приложения
https://github.com/azalio/buildpack-test/blob/master/ruby-buildpack/bin/build#L23
Далее идут оптимизации по работе с кешом и установка гемов
https://github.com/azalio/buildpack-test/blob/master/ruby-buildpack/bin/build#L33
Тут мы говорим как запускать наше приложение
https://github.com/azalio/buildpack-test/blob/master/ruby-buildpack/bin/build#L59
Как вы можете увидеть его можно запустись по-разному
По дефолту запустится
```
docker run --rm -p 8080:8080 test-ruby-app
docker run --rm --entrypoint worker test-ruby-app
```
```
bundle exec ruby app.rb
```
В принципе это все, остальное - оптимизации
Запускаем сборку
```
# Установили дефолтный билдер - https://buildpacks.io/docs/concepts/components/builder/
pack config default-builder cnbs/sample-builder:bionic
# Собираем
pack build test-ruby-app --path ./ruby-sample-app --buildpack ./ruby-buildpack
bionic: Pulling from cnbs/sample-builder
Digest: sha256:a674cd6b556924e0b36000c00f0cda8ee42c20aa9be45e4ddfc65ea43c5423e7
Status: Image is up to date for cnbs/sample-builder:bionic
bionic: Pulling from cnbs/sample-stack-run
Digest: sha256:0e6d2966062c26f0a0660c89c5bd1dba7e1fa019e6d68ef5c3694eafde1ab805
Status: Image is up to date for cnbs/sample-stack-run:bionic
0.10.2: Pulling from buildpacksio/lifecycle
Digest: sha256:c3a070ed0eaf8776b66f9f7c285469edccf5299b3283c453dd45699d58d78003
Status: Image is up to date for buildpacksio/lifecycle:0.10.2
===> DETECTING
[detector] examples/ruby 0.0.1
===> ANALYZING
[analyzer] Restoring metadata for "examples/ruby:bundler" from app image
[analyzer] Restoring metadata for "examples/ruby:ruby" from app image
===> RESTORING
[restorer] Restoring data for "examples/ruby:bundler" from cache
===> BUILDING
[builder] ---> Ruby Buildpack
[builder] ---> Downloading and extracting Ruby 2.5.0
[builder] ---> Installing bundler
[builder] Successfully installed bundler-2.2.17
[builder] 1 gem installed
[builder] ---> Reusing gems
===> EXPORTING
[exporter] Reusing layer 'examples/ruby:bundler'
[exporter] Reusing layer 'examples/ruby:ruby'
[exporter] Reusing 1/1 app layer(s)
[exporter] Reusing layer 'launcher'
[exporter] Reusing layer 'config'
[exporter] Reusing layer 'process-types'
[exporter] Adding label 'io.buildpacks.lifecycle.metadata'
[exporter] Adding label 'io.buildpacks.build.metadata'
[exporter] Adding label 'io.buildpacks.project.metadata'
[exporter] Setting default process type 'web'
[exporter] *** Images (cee365e8df4f):
[exporter] test-ruby-app
[exporter] Reusing cache layer 'examples/ruby:bundler'
Successfully built image test-ruby-app
```
Запускаем приложение
```
docker run --rm -p 8080:8080 test-ruby-app
[2021-05-13 13:11:00] INFO WEBrick 1.4.2
[2021-05-13 13:11:00] INFO ruby 2.5.0 (2017-12-25) [x86_64-linux]
== Sinatra (v2.0.7) has taken the stage on 8080 for development with backup from WEBrick
[2021-05-13 13:11:00] INFO WEBrick::HTTPServer#start: pid=1 port=8080
```

P.S.
Для самых любопытных:
https://github.com/buildpacks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment