Docker Compose build: --no-cache, up --build и ошибка отсутствующего Buildx
Автор: Казачкин Даниил Михайлович · Обновлено
docker compose build собирает образы сервисов, а docker compose up создаёт или обновляет контейнеры. Эти фазы связаны, но их результат разный: после удачной сборки старый…
docker compose build собирает образы сервисов, а docker compose up создаёт или обновляет контейнеры. Эти фазы связаны, но их результат разный: после удачной сборки старый работающий контейнер может продолжать использовать прежний образ. Разберём команды на самостоятельном Compose-файле.
Проект с собственной сборкой
Создайте app.py и Dockerfile из урока Python-приложения, а рядом сохраните compose.yaml:
name: dk-compose-build
services:
web:
image: dk-compose-python:dev
build:
context: .
dockerfile: Dockerfile
environment:
GREETING: compose-built
ports:
- "127.0.0.1:18090:8000"context определяет передаваемые файлы, dockerfile — рецепт внутри выбранного контекста. image задаёт имя результата. Изменение environment требует применения конфигурации контейнера; изменение файла, скопированного через COPY, требует новой сборки образа.
docker compose config
docker compose build web
docker compose up -d web
docker compose psОткройте http://127.0.0.1:18090/: ожидается JSON с compose-built. Если нужно видеть шаги сборки подробно, используйте docker compose --progress plain build web. Команда Compose build.
Что делает каждая комбинация
| Команда | Результат |
|---|---|
docker compose build web | Собирает образ; контейнеры не запускает |
docker compose up -d --build web | Сначала собирает, затем запускает или пересоздаёт |
docker compose build --no-cache web | Повторяет сборку без кэша слоёв |
docker compose build --pull --no-cache web | Дополнительно проверяет базовые образы |
docker compose restart web | Перезапускает текущий контейнер без новой сборки |
docker compose build up трактует up как имя сервиса, а не вторую команду. Если сервиса up нет, получите ошибку. Для «build и up» используйте две команды либо up -d --build. В варианте без кэша сначала выполните docker compose build --no-cache web, затем docker compose up -d web: флаг no-cache относится к build. Параметры up.
Проверка, что код действительно обновился
Измените ответ app.py, запустите только docker compose build web и запросите страницу. Старый контейнер ещё может отдавать прежний ответ. После docker compose up -d web проверьте ответ заново. Если обновление не видно, сравните итоговую конфигурацию, текущую папку и docker compose images. Дополнительный bind mount на /app может скрывать код образа — тогда источник видимых файлов нужно искать в mounts.
Compose configured to build using Bake, but Buildx isn't installed
Сообщение Docker Compose is configured to build using Bake, but buildx isn't installed относится к инструментам сборки, а не к приложению. Bake — высокоуровневое описание сборок, которое выполняется через Buildx. Сначала проверьте:
docker compose version
docker buildx version
docker context showЕсли buildx не найден, на Linux с официальным Docker apt-репозиторием нужен совместимый docker-buildx-plugin; на Desktop проверьте комплект установки и путь к CLI. Команды от обычного пользователя и через sudo могут находить разные плагины. Не устанавливайте случайный бинарник в системный путь, не проверив архитектуру и источник.
Посмотрите, не включён ли COMPOSE_BAKE в shell, .env или настройках CI. В версиях Compose, которые поддерживают переключение, диагностический запуск в Bash выглядит так: COMPOSE_BAKE=false docker compose build web. Это не установка Buildx и не долговременная замена актуальной поддерживаемой конфигурации. Проверьте результат и исправьте комплект инструментов. Переменные Compose, Bake и Compose.
Упражнение
Измените сначала GREETING, затем код ответа. Для каждого изменения заранее выберите минимальную нужную операцию и подтвердите её HTTP-запросом. Повторите сборку с кэшем и без него, сравнив строки журнала, а не только секунды. Завершите docker compose down. Объясните, почему no-cache не исправляет неверный build context и почему restart не заменяет применение нового образа.