DevOps Středně pokročilý
Docker Multi-stage Builds¶
DockerContainerizationOptimalizace 6 min čtení
Optimalizace Docker obrazů pomocí multi-stage builds. Menší image, rychlejší deploy, bezpečnější kontejnery.
Proč Multi-stage¶
Klasický Dockerfile obsahuje build tools i v produkčním image. Multi-stage builds oddělují build a runtime fázi.
- Menší finální image (100 MB vs 1 GB)
- Žádné build tools v produkci
- Rychlejší pull a deploy
- Menší attack surface
Příklad: Go Aplikace¶
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /app/server ./cmd/server
FROM gcr.io/distroless/static-debian12:nonroot
COPY --from=builder /app/server /server
USER nonroot:nonroot
EXPOSE 8080
ENTRYPOINT ["/server"]
Výsledný image: ~10 MB místo ~800 MB s plným Go SDK.
Příklad: Node.js¶
FROM node:20-alpine AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-alpine
WORKDIR /app
RUN addgroup -g 1001 -S nodejs && adduser -S nextjs -u 1001
COPY --from=deps /app/node_modules ./node_modules
COPY --from=build /app/dist ./dist
USER nextjs
EXPOSE 3000
CMD ["node", "dist/main.js"]
Best Practices¶
- Používejte
.dockerignore— vylučte node_modules, .git, docs - Řaďte COPY příkazy od nejméně měnících se po nejčastěji měněné
- Použijte
--mount=type=cachepro cachování build závislostí - Pinujte verze base image (ne
:latest) - Skenujte výsledný image:
trivy image myapp:latest
Shrnutí¶
Multi-stage builds jsou základ moderní containerizace. Oddělení build a runtime fáze dramaticky snižuje velikost image a zlepšuje bezpečnost.
Potřebujete pomoct s implementací?¶
Náš tým má zkušenosti s návrhem a implementací moderních architektur. Rádi vám pomůžeme.