Dockerfile-generator

Dockerfile
Resultaten

Een Dockerfile is zo’n bestand dat kort lijkt totdat je de details onthoudt: laagvolgorde is belangrijk voor de cache, COPY package.json gaat vóór RUN npm install, en gecompileerde talen profiteren van een multi-stage build. Deze generator schrijft een kant-en-klaar Dockerfile voor de stack die je kiest, met het cachepatroon al correct.

Zo genereer je een Dockerfile

  1. 1

    Kies de stack

    Node.js, Python, PHP, Go of Rust. Elke sjabloon gebruikt een passend basis-image voor die taal en het juiste commando om afhankelijkheden te installeren.

  2. 2

    Stel de werkmap en poort in

    Kies de WORKDIR en de poort waar je app op luistert; beide worden in het gegenereerde bestand gezet.

  3. 3

    Controleer het Dockerfile

    Controleer of de EXPOSE-regel en het startcommando bij je app passen. De Go- en Rust-sjablonen gebruiken een multi-stage build.

  4. 4

    Kopieer het Dockerfile

    Kopieer het resultaat, plak het in de hoofdmap van je repository en bouw daarna de image.

Waarom multi-stage builds

Een naïef Dockerfile installeert de hele compiler-toolchain in de uiteindelijke image. Multi-stage builds geven je een “builder”-fase die compileert en een eindfase die alleen het gecompileerde artefact bevat:

FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER node
EXPOSE 3000
CMD ["node", "dist/index.js"]

De eindimage laat elke ontwikkelafhankelijkheid, elk bronbestand en de buildcache weg, waardoor de image vaak 60-80 procent kleiner wordt.

Basis-imagevarianten

De sjablonen gebruiken waar mogelijk slim- of alpine-images. Pas je het basis-image zelf aan, dan zijn dit de gebruikelijke opties:

Variant Typische grootte Wanneer kiezen
full 300-900 MB Ontwikkelimages, ongebruikelijke systeemafhankelijkheden
slim 80-200 MB Productiestandaard voor de meeste talen
alpine 30-100 MB Kleine images, let op glibc-vs-musl-problemen
distroless 20-80 MB Maximale beveiliging; geen shell, geen pakketbeheerder

Regels voor laagcaching

Docker cached elke regel; zodra een laag verandert, wordt alles eronder opnieuw gebouwd. Volgorde van minst naar meest veranderlijk:

  1. Basis-image FROM (verandert zelden).
  2. Systeempakketten (apt-get install), zeldzame wijzigingen.
  3. Afhankelijkheidsmanifests (package.json, requirements.txt, composer.json).
  4. Installatiestap voor afhankelijkheden. Draait alleen wanneer het manifest verandert.
  5. Kopie van de broncode. De drukste laag; alles erna wordt bij elke commit herbouwd.
  6. Compileren en uiteindelijke CMD.

Deze volgorde doorbreken is de meest voorkomende reden dat CI-builds traag worden.

Beveiligingscontrolelijst

  • Uitvoeren als niet-root. Zet USER appuser (of USER 1000) aan het einde.
  • Versies vastpinnen. python:3.12.7-slim verslaat python:3.12, dat python:latest verslaat.
  • Stel een expliciete WORKDIR in in plaats van op / te vertrouwen.
  • Gebruik COPY in plaats van ADD voor lokale bestanden; ADD heeft bijwerkingen door automatische extractie.
  • Voeg een HEALTHCHECK toe zodat orchestrators een vastgelopen proces kunnen detecteren.
  • Ruim pakketcaches op in dezelfde RUN-regel: apt-get install ... && rm -rf /var/lib/apt/lists/*.

Veelgestelde vragen

Slim is een veiligere standaard omdat het nog steeds op glibc is gebaseerd, net als de meeste voorgecompileerde wheels van bibliotheken. Alpine gebruikt musl en veroorzaakt af en toe mysterieuze runtime-bugs in Python (pandas, numpy) of Node (node-gyp native modules). Kies alpine wanneer imagegrootte cruciaal is en je de stack hebt getest.

Ja, voeg er een toe aan je project. Zonder die file stuurt Docker je hele repository als buildcontext naar de daemon: git-geschiedenis, node_modules, lokale .env-bestanden, tests. Dat is traag, verspilt cache en lekt geheimen.

Ja. Gebruik docker buildx met de optie --platform om voor beide architecturen tegelijk te bouwen. De basis-images die de sjablonen gebruiken, leveren arm64-varianten.

Nee. De keuzes voor stack, werkmap en poort worden alleen gebruikt om het Dockerfile op deze pagina te genereren; er wordt niets opgeslagen of gedeeld.

Gerelateerde tools

Tool beschikbaar in andere talen