TGViewer
Сергей Предводителев Сергей Предводителев @sergei_predvoditelev · 1.2K subscribers
Post #283 905
🌿 Про Docker Bake

Продолжаю эксперименты с контейнеризацией агентов. Решил добавить внутрь контейнера PHP с версиями от 8.1 до 8.5 и необходимыми расширениями. PHP собираю из исходников, поэтому в Dockerfile использую многоэтапную сборку. В итоге Dockerfile вырос до неприличных размеров, читать и поддерживать его в таком виде стало довольно сложно.

Сам по себе Dockerfile не поддерживает разбиение на несколько файлов. Но есть несколько путей, как решить эту задачу.

Генерация Dockerfile — разбиваем Dockerfile на несколько и пишем скрипт, который перед сборкой образа будет собирать один Dockerfile.

Промежуточные образы — разбиваем Dockerfile на несколько по стадиям, а при сборке образа выполняем сборку каждой стадии отдельно, но в нужном порядке.

В обоих вариантах мне не нравится, что нужно писать и поддерживать что-то своё — в первом случае скрипт генерации, а во втором список команд для сборки.

К счастью, есть и третий вариант — Bake. Это команда Docker Buildx для декларативного управления сборками образов через конфигурационный файл в формате JSON или HCL. Мне понравился HCL, выглядит чище, чем JSON. В моём случае файл docker-bake.hcl получился примерно такой:

variable "DEBIAN_VERSION" {
default = "13"
}

group "default" {
targets = ["pi", "claude-code"]
}

target "php-builder" {
dockerfile = "docker/php-builder/Dockerfile"
context = "."
args = {
DEBIAN_VERSION = DEBIAN_VERSION
}
}

target "php-8-1" {
dockerfile = "docker/php-8.1/Dockerfile"
context = "."
contexts = {
php-builder = "target:php-builder"
}
}

# ...

target "base" {
dockerfile = "docker/Dockerfile"
target = "base"
context = "."
contexts = {
php-8-1 = "target:php-8-1"
php-8-2 = "target:php-8-2"
php-8-3 = "target:php-8-3"
php-8-4 = "target:php-8-4"
php-8-5 = "target:php-8-5"
}
args = {
DEBIAN_VERSION = DEBIAN_VERSION
}
}

target "pi" {
inherits = ["base"]
target = "pi"
tags = ["pi-harness:latest"]
}

target "claude-code" {
inherits = ["base"]
target = "claude-code"
tags = ["claude-code-harness:latest"]
}


Таким образом я разбил один большой Dockerfile на несколько: каждая стадия — отдельный файл. Конфигурация Bake описывает как и в каком порядке собирать образы. Сама сборка выполняется просто командой:

# Pi Harness image
docker buildx bake -f docker/docker-bake.hcl pi

# Claude Code Harness image
docker buildx bake -f docker/docker-bake.hcl claude-code


Помимо декларативного описания зависимостей Bake умеет в параллельную сборку стадий, что ещё и ускоряет сборку 🚀

Удобная штука 🙂
  • 👍 19
More from @sergei_predvoditelev
  1. Sep 20, 2026🌿 Про хардкорный курс асинхронного PHP Записался на курс по асинхронному PHP, который зап…
  2. Sep 17, 2026🌿 Про автоматическое ревью и слияние PR Егор Бугаенко в 101 выпуске вопросов/ответов расс…
  3. Sep 9, 2026Пыхник’26 — целая неделя PHP! С 28 сентября по 2 октября пройдёт Пыхник’26 — онлайн-конфер…
  4. Aug 31, 2026#инфопузырь ☕️ Инфопузырь #20 (Август 2026) Ещё один короткий выпуск... Думаю, в сентябре…
  5. Aug 27, 2026🌿 Про Ghostty Весной я переехал со стандартного GNOME Terminal на WezTerm. И всё меня уст…
  6. Aug 22, 2026🌿 Про nono В комментариях к посту про локальных агентов упомянули песочницу для агентов n…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →