BuildKit – nowoczesny silnik budowania obrazów Docker
Przez wiele lat Docker korzystał z klasycznego mechanizmu budowania obrazów. Działał on poprawnie, ale miał ograniczenia: budował instrukcje liniowo, słabiej wykorzystywał cache i nie był projektowany z myślą o dużych środowiskach CI/CD.
Rozwiązaniem stał się BuildKit – nowoczesny backend odpowiedzialny za budowanie obrazów kontenerów.
Dzisiaj BuildKit jest standardem w ekosystemie Docker i stanowi podstawę szybkiego oraz bezpieczniejszego procesu tworzenia obrazów.
Czym jest BuildKit?
BuildKit (Build Toolkit) to niezależny silnik budowania obrazów kontenerowych rozwijany w ramach projektu Moby.
Jego zadaniem jest zastąpienie starego buildera Dockera.
Klasyczny model:
Dockerfile
↓
Docker Builder
↓
Image
BuildKit:
Dockerfile
↓
BuildKit Engine
↓
Build Graph
↓
Optimized Build
↓
Image
Najważniejsza różnica:
BuildKit nie wykonuje instrukcji wyłącznie od góry do dołu. Analizuje cały proces i tworzy graf zależności budowania.
Dlaczego powstał BuildKit?
Starszy builder Dockera miał kilka problemów:
- wykonywał każdą instrukcję po kolei,
- gorzej wykorzystywał cache,
- niepotrzebnie wykonywał niektóre kroki,
- miał ograniczone możliwości dla dużych projektów.
Przykład:
FROM ubuntu
RUN apt update
RUN apt install nginx
COPY app /app
RUN make build
Stary builder:
Step 1
↓
Step 2
↓
Step 3
↓
Step 4
BuildKit:
Analiza zależności
↓
wykonanie tylko potrzebnych operacji
Architektura BuildKit
BuildKit składa się z kilku elementów:
Docker CLI
↓
Buildx
↓
BuildKit
↓
LLB Build Graph
↓
Container Image
Buildx – interfejs dla BuildKit
Współczesny Docker używa narzędzia:
docker buildx
Sprawdzenie:
docker buildx version
Przykład budowania:
docker buildx build .
Najważniejsza funkcja – inteligentny cache
Jedną z największych zalet BuildKit jest zaawansowany cache.
Przykład:
Dockerfile:
FROM python:3.12
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD python app.py
Zmiana kodu:
app.py
Nie powoduje ponownej instalacji bibliotek.
BuildKit rozpoznaje:
requirements.txt
nie zmienił się
↓
użyj cache
Cache między maszynami
W dużych środowiskach CI/CD można przechowywać cache poza lokalnym komputerem.
Przykład:
docker buildx build \
--cache-to type=registry \
--cache-from type=registry
Schemat:
Developer
↓
BuildKit
↓
Cache Registry
↓
CI/CD Pipeline
Efekt:
- szybsze buildy,
- mniejsze zużycie zasobów.
Równoległe budowanie
BuildKit potrafi wykonywać niezależne zadania jednocześnie.
Przykład:
RUN install package A
RUN install package B
Jeżeli kroki nie zależą od siebie:
Package A ───┐
├── Build
Package B ───┘
Multi-stage builds z BuildKit
BuildKit świetnie współpracuje z wieloetapowym budowaniem.
Przykład:
FROM golang AS builder
WORKDIR /app
COPY .
RUN go build app.go
FROM alpine
COPY --from=builder /app/app /
CMD ["/app"]
Efekt:
Pierwszy etap:
kompilator
biblioteki
źródła
Drugi:
tylko gotowa aplikacja
Korzyści:
- mniejsze obrazy,
- mniej podatności,
- szybsze wdrożenia.
BuildKit i bezpieczeństwo sekretów
Jednym z dużych problemów starego Dockera było przechowywanie sekretów podczas budowania.
Zły przykład:
ENV PASSWORD=mysecret
Sekret trafia do historii obrazu.
BuildKit pozwala użyć tymczasowych sekretów.
Przykład:
docker build \
--secret id=mykey,src=key.txt .
Dockerfile:
RUN --mount=type=secret,id=mykey \
cat /run/secrets/mykey
Sekret:
- jest dostępny tylko podczas builda,
- nie trafia do obrazu.
SSH forwarding w BuildKit
Przydatne przy prywatnych repozytoriach.
Przykład:
docker build \
--ssh default .
Dockerfile:
RUN --mount=type=ssh \
git clone private_repo
Klucz SSH:
- nie jest kopiowany,
- nie zostaje w obrazie.
Rootless BuildKit
BuildKit może działać bez uprawnień root.
Schemat:
User
↓
Rootless BuildKit
↓
Container Image
Zalety:
- mniejsze ryzyko,
- lepsze środowiska CI,
- zgodność z zasadami least privilege.
BuildKit i Dockerfile frontend
BuildKit rozszerza możliwości Dockerfile.
Przykład:
# syntax=docker/dockerfile:1
Pozwala korzystać z nowych funkcji:
- secret mounts,
- SSH mounts,
- cache mounts.
Cache mounts
Przykład:
RUN --mount=type=cache,target=/root/.cache \
pip install -r requirements.txt
Efekt:
Pakiety nie muszą być pobierane za każdym razem.

BuildKit w CI/CD
Nowoczesny pipeline:
Developer
↓
Git Repository
↓
CI Pipeline
↓
BuildKit
↓
Security Scan
↓
Registry
↓
Production
Przykładowe narzędzia:
- GitHub Actions,
- GitLab CI,
- Jenkins,
- Tekton.
BuildKit i Docker Registry
Obrazy mogą być wysyłane bezpośrednio:
docker buildx build \
--push \
-t registry/app:v1 .
Schemat:
BuildKit
↓
Image
↓
Registry
↓
Kubernetes
Multi-platform builds
Jedna z najważniejszych funkcji.
Przykład:
Budowanie obrazu dla:
- amd64,
- ARM64.
Polecenie:
docker buildx build \
--platform linux/amd64,linux/arm64 \
--push .
Przydatne dla:
- serwerów Intel,
- Raspberry Pi,
- Apple Silicon,
- chmury.
BuildKit a bezpieczeństwo łańcucha dostaw
Współczesne ataki często dotyczą nie samej aplikacji, ale procesu budowania.
Przykład:
Developer
↓
Build system
↓
Image
↓
Registry
↓
Production
Jeżeli build jest niebezpieczny, problem trafia do produkcji.
BuildKit pomaga przez:
- izolację buildów,
- sekrety runtime,
- reprodukowalne buildy,
- kontrolę cache.
Diagnostyka BuildKit
Sprawdzenie:
docker info
Szukamy:
BuildKit enabled
Lista builderów:
docker buildx ls
Tworzenie buildera:
docker buildx create \
--name secure-builder
Użycie:
docker buildx use secure-builder
BuildKit vs klasyczny Docker Builder
| Cecha | Docker Builder | BuildKit |
|---|---|---|
| Cache | podstawowy | zaawansowany |
| Równoległość | ograniczona | tak |
| Sekrety | problematyczne | bezpieczne mounty |
| Multi-platform | ograniczone | tak |
| CI/CD | średnie | bardzo dobre |
| Rootless | ograniczone | tak |
Najczęstsze błędy przy BuildKit
1. Wrzucanie sekretów do obrazu
Źle:
COPY .env /
Lepiej:
BuildKit secrets
2. Brak kontroli cache
Cache może zawierać informacje o procesie budowania.
W środowisku enterprise:
- kontroluj registry,
- ogranicz dostęp,
- czyść stare warstwy.
3. Zbyt duże obrazy
BuildKit pomaga, ale nadal trzeba stosować:
- multi-stage builds,
- minimalne obrazy,
- .dockerignore.
BuildKit w pełnej architekturze bezpieczeństwa kontenerów
W dojrzałym środowisku wygląda to tak:
Developer
↓
BuildKit
↓
Image Scanner
↓
Registry
↓
Kubernetes
↓
┌───────────┬───────────┐
Seccomp SELinux cgroups
↓
Linux Kernel
Podsumowanie
BuildKit jest obecnie fundamentem nowoczesnego budowania obrazów Docker.
Najważniejsze korzyści:
✅ szybsze buildy
✅ inteligentny cache
✅ bezpieczne sekrety
✅ buildy wieloplatformowe
✅ lepsza integracja z CI/CD
✅ możliwość pracy rootless
W praktyce BuildKit zmienia Docker z prostego narzędzia do pakowania aplikacji w pełnoprawny system budowania obrazów dla środowisk produkcyjnych.
W połączeniu z:
- Docker Bench Security,
- Rootless Docker,
- OverlayFS,
- namespaces,
- cgroups v2,
- Seccomp,
- AppArmor/SELinux,
tworzy podstawę bezpiecznego łańcucha dostarczania aplikacji (secure container supply chain).






