Dockerfile Gen
Container Architecture & Cloud-Native Security

Multi-Stage Dockerfile Generator (Node, Go, Python, Rust)

Erstellen Sie gehärtete, schlanke Multi-Stage-Dockerfiles für Node.js, Golang, Python, Rust und Java mit Non-Root-Sicherheit und BuildKit-Cache-Optimierung.

Zero Build Telemetry
CIS Docker Compliant
Schnellvorlagen
Anwendungs- & Laufzeitkonfiguration
Sicherheitshärtung
# =========================================================================# Multi-Stage Dockerfile: Next.js Standalone (Hardened & Layer-Cached)# Generated by ToolsAA Multi-Stage Dockerfile Generator# =========================================================================# syntax=docker/dockerfile:1.6
# -------------------------------------------------------------------------# Stage 1: Dependencies Resolution# -------------------------------------------------------------------------FROM node:22-alpine AS depsWORKDIR /app
# Install libc6-compat if Alpine (required for some Node native extensions)RUN apk add --no-cache libc6-compat
# Install package manager lockfiles first to leverage layer cachingCOPY package.json package-lock.json* yarn.lock* pnpm-lock.yaml* bun.lockb* ./RUN --mount=type=cache,target=/root/.npm \    if [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm install --frozen-lockfile; \    elif [ -f yarn.lock ]; then yarn --frozen-lockfile; \    elif [ -f bun.lockb ]; then npm install -g bun && bun install --frozen-lockfile; \    else npm ci; fi
# -------------------------------------------------------------------------# Stage 2: Application Builder# -------------------------------------------------------------------------FROM node:22-alpine AS builderWORKDIR /app
COPY --from=deps /app/node_modules ./node_modulesCOPY . .
# Disable Next.js telemetry during compilationENV NEXT_TELEMETRY_DISABLED=1ENV NODE_ENV=production
RUN --mount=type=cache,target=/app/.next/cache \    if [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \    elif [ -f yarn.lock ]; then yarn build; \    else npm run build; fi
# -------------------------------------------------------------------------# Stage 3: Production Minimal Runner# -------------------------------------------------------------------------FROM node:22-alpine AS runnerWORKDIR /app
ENV NODE_ENV=production \    PORT=3000 \    NEXT_TELEMETRY_DISABLED=1ENV NODE_ENV=productionENV PORT=3000ENV HOSTNAME="0.0.0.0"
# Security: Create unprivileged system group and userRUN addgroup -g 10001 -S nodejs && \    adduser -u 10001 -S -G nodejs nextjs# Copy public static assets and standalone bundleCOPY --from=builder /app/public ./publicCOPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \  CMD wget --no-verbose --tries=1 --spider http://127.0.0.1:3000/api/health || exit 1EXPOSE 3000
USER nextjsCMD ["node", "server.js"]
Geschätzte Endgröße-82%
~110 MB

Pruned compilation tools and devDependencies from runner stage.

Sicherheitshärtungs-BewertungGrade A+
95 / 100 CIS

UID 10001 unprivileged non-root execution with dropped capabilities.

Build-Stufen-EffizienzBuildKit Active
3 Separated Layers

Sub-second rebuilds via lockfile pre-caching and BuildKit mounts.

Multi-Stage-Layer-Optimierung

Trennt Build-Abhängigkeiten und Caches sauber von Produktionsumgebungen und reduziert das finale Image um bis zu 92%.

CIS-Benchmark-Sicherheitsleitplanken

Erstellt Non-Root-Benutzer (UID 10001), entfernt Linux-Capabilities und verbannt Compiler aus dem Produktions-Container.

Null-Server-Upload-Privatsphäre

Alle Projektdateien und Dockerfiles werden ausschließlich im Browser-Speicher ohne Netzwerkübertragung verarbeitet.

Technische Referenz & Architektur-Leitfaden

Multi-Stage Dockerfile Generator (Node, Go, Python, Rust) — Referenz-Leitfaden

Erstellen Sie gehärtete, schlanke Multi-Stage-Dockerfiles für Node.js, Golang, Python, Rust und Java mit Non-Root-Sicherheit und BuildKit-Cache-Optimierung.

Wichtige Parameter & Steuerelemente

runtimestring

Ziel-Laufzeitumgebung und Programmiersprache der Anwendung (z. B. node, golang, python, rust, java).

Standard: node
baseImagestring

Basis-Betriebssystem oder Minimal-Image für die finale Produktionsstufe (z. B. alpine, debian-slim, distroless, scratch).

Standard: alpine
nonRootUserboolean

Erzwingt das Least-Privilege-Prinzip durch Erstellen einer unprivilegierten UID/GID (10001) und Umschalten mit der USER-Anweisung.

Standard: true
cacheMountsboolean

Aktiviert BuildKit-Cache-Mounts (--mount=type=cache) für Paketmanager (npm, pip, cargo, go) zur massiven Beschleunigung von Rebuilds.

Standard: true
portnumber

Primärer Netzwerk-Port, der über die EXPOSE-Anweisung im Container bereitgestellt wird.

Standard: 3000

Profi-Tipps & Best Practices

Manifest-First Schichtenarchitektur

Kopieren Sie Abhängigkeitsdateien (package.json, go.mod, Cargo.toml, requirements.txt) vor dem eigentlichen Quellcode. Dadurch kann Docker bei Code-Änderungen die bestehenden Schichten mit den heruntergeladenen Abhängigkeiten vollständig wiederverwenden.

Nutzen Sie für kompilierte Sprachen

Nutzen Sie für kompilierte Sprachen wie Go und Rust 'scratch' oder 'gcr.io/distroless/static' in der finalen Stufe. Ohne System-Shells und Paketmanager sinkt die Image-Größe oft unter 25 MB und CVE-Sicherheitslücken werden drastisch minimiert.

Verwenden Sie 'RUN --mount=type=cache

Verwenden Sie 'RUN --mount=type=cache,target=...', um temporäre Compiler- und Paket-Caches während des Builds zwischenzuspeichern, ohne das resultierende Image aufzublähen. Nutzen Sie für Zugangsdaten '--mount=type=secret' anstelle von Umgebungsvariablen.

Definieren Sie immer feste numerische

Definieren Sie immer feste numerische Benutzer- und Gruppen-IDs (z. B. addgroup -g 10001 -S appgroup && adduser -u 10001 -S appuser -G appgroup). Dies garantiert reibungslose Kompatibilität mit Kubernetes RunAsNonRoot-Sicherheitsrichtlinien.

Häufige Fallstricke & Fehlerbehebung

Container stürzt beim Start mit 'Permission denied (EACCES)' bei Log- oder Schreiboperationen ab.

Der unprivilegierte Benutzer besitzt keine Schreibrechte im Anwendungsverzeichnis. Weisen Sie die Verzeichnisrechte vor der 'USER appuser'-Deklaration über 'RUN chown -R appuser:appgroup /app /tmp' explizit zu.

Go- oder Rust-Binary scheitert unter Alpine oder Scratch mit 'exec: no such file or directory'.

Das Binary wurde dynamisch gegen glibc gelinkt, während Alpine musl verwendet und Scratch keine C-Bibliothek besitzt. Kompilieren Sie Go mit 'CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w"' oder kompilieren Sie Rust gegen das 'x86_64-unknown-linux-musl'-Target.

BuildKit-Cache-Mount-Anweisungen (--mount=type=cache) erzeugen Syntaxfehler beim docker build.

Fügen Sie '# syntax=docker/dockerfile:1' als allererste Zeile in Ihr Dockerfile ein und aktivieren Sie BuildKit auf Ihrem Host via 'export DOCKER_BUILDKIT=1' oder nutzen Sie 'docker buildx build'.

Häufig gestellte Fragen (FAQ)

Warum sind Multi-Stage-Builds herkömmlichen Single-Stage-Dockerfiles überlegen?▼

Multi-Stage-Builds trennen die ressourcenintensive Build-Umgebung (Compiler, SDKs, Build-Tools, Quellcode-Header) von der schlanken Laufzeitumgebung. Indem nur das fertige Artefakt in ein minimalistisches Basis-Image übertragen wird, reduziert sich die Größe meist um 80 bis 95 Prozent und potenzielle Angriffsvektoren entfallen.

Wann sollte man Distroless oder Scratch anstelle von Alpine Linux wählen?▼

Scratch und Distroless eignen sich perfekt für statisch kompilierte Binärdateien (Go, Rust), bei denen maximale Sicherheit ohne interaktive Shells gefordert ist. Alpine empfiehlt sich, wenn eine Shell zur Fehlerdiagnose oder dynamische Bibliotheken (musl libc) benötigt werden, bei weiterhin extrem geringem Speicherbedarf (<10 MB).

Worin liegt der Unterschied zwischen BuildKit Cache-Mounts und standardmäßigem Schichtencaching?▼

Der normale Schichtencache wird ungültig, sobald sich eine Datei in vorangegangenen Schritten ändert. BuildKit Cache-Mounts (--mount=type=cache) binden ein hostseitiges Cache-Verzeichnis direkt in den RUN-Befehl ein, wodurch Paketmanager-Downloads auch bei modifiziertem Quellcode persistent erhalten bleiben.

Warum ist der Verzicht auf den Root-Benutzer in Produktions-Containern essenziell?▼

Container teilen sich den Kernel des Hostsystems. Läuft ein Prozess im Container als Root (UID 0) und gelingt ihm ein Ausbruch über eine Kernel-Schwachstelle, erlangt er unmittelbare Root-Rechte auf dem Host. Ein unprivilegierter Non-Root-Benutzer schützt vor dieser Privilegienerweiterung.

Verwandte Werkzeuge & Dienstprogramme

Alle Werkzeuge →