Meer informatie over Dockerfile

Stappen in de Systematische Probleem Aanpak

1. Doel

Automatiseren van het Docker image build-proces via declaratieve instructies.

2. Subdoelen

Splits het proces in subdoelen, zoals:

  • Aanmaken Dockerfile
  • Selecteren van een basisimage
  • Inrichten van een werkdirectory
  • Kopiëren van bestanden
  • Installeren van afhankelijkheden
  • Exposen van poorten
  • Definiëren van een startcommando

Casus

Ontwerp een Dockerfile voor een Node.js API in 7 stappen:

DoelDockerfile InstructieResultaat in Image
1. Aanmaken DockerfileMaak in je projectmap een bestand zonder extensie DockerfileLege Dockerfile klaar voor instructies
2. Selecteren van een basisimageFROM node:18-alpineMinimale Node.js runtime-omgeving
3. Inrichten van een werkdirectoryWORKDIR /appVolgende commando’s draaien in /app
4. Kopiëren van bestandendockerfile<br>COPY package*.json ./<br>COPY src/ ./src/package.json, lockfiles én broncode in de image
5. Installeren van afhankelijkhedenRUN npm ci --productionGepinde npm-packages geïnstalleerd
6. Exposen van poortenEXPOSE 3000Poort 3000 open voor inkomend verkeer
7. Definiëren van een startcommandoCMD ["node", "src/index.js"]Container start je API automatisch bij opstarten

3. Fasen

  1. Aanmaken Dockerfile Actie: Maak een bestand aan zonder extensie en noem het Dockerfile. Plaats dit bestand in je projectmap. Bij C# is dit in dezelfde folder als .csproj en in Javascript in de folder met package.json. Resultaat: Een lege Dockerfile in je project.

  2. Base Image Definiëren
    Actie: Selecteer een officiële base image die past bij je applicatie (bijv. python:3.11-slim of alpine). Deze base images zijn te vinden op Docker Hub. Zet het commando FROM met daarachter de naam van de base image in bovenaan de Dockerfile om deze te gebruiken. Resultaat: Een schone, gestandaardiseerde basis.

  3. Werkomgeving Configureren
    Actie: Plaats het commando WORKDIR met daarachter het pad naar een folder. Het pad is niet altijd nodig en is afhankelijk van je applicatie. Als je bijvoorbeeld werkt met Node.js, zal het pad /app zijn. Resultaat: Een pad waar binnen de container waar de volgende commandos op uitgevoerd worden.

  4. **Bestanden Kopiëren
    Actie: Gebruik het COPY-commando om projectbestanden vanaf je pc naar de image te kopiëren wanneer deze gebouwd wordt. Je kan bijvoorbeeld COPY . . gebruiken om alle bestanden naar de directory te kopiëren. Resultaat: Alle benodigde bestanden (code, configuraties) zijn in de image aanwezig.

  5. Afhankelijkheden Installeren en Build-stappen
    Actie: Gebruik RUN om:

    • Afhankelijkheden te installeren (bijv. RUN npm install voor JavaScript of RUN pip install -r requirements.txt voor Python).
    • De applicatie te bouwen (bijv. RUN npm run build voor een React-app of RUN dotnet publish -c Release voor C#).
      Resultaat: Afhankelijkheden zijn geïnstalleerd en de applicatie is klaar voor gebruik.

Tip

Plaats dit na het kopiëren van dependency-bestanden om Docker’s cache optimaal te benutten.

  1. Poort Exposen
    Actie: Gebruik het EXPOSE-commando in de Dockerfile om aan te geven op welke poort(en) de container luistert. Dit is dus de poort waar je jouw applicatie vind als je deze lokaal draait. Bij Python Flaks staat dit standaard op poort 5000. Deze kan dan opengezet worden met EXPOSE 5000.
    Resultaat: Docker weet welke poorten relevant zijn voor de applicatie.

  2. Startcommando Definiëren (CMD)
    Actie: Gebruik CMD om het standaardcommando te specificeren dat de applicatie start.
    Voorbeelden:

    • JavaScript: CMD ["node", "index.js"]
    • C#: CMD ["dotnet", "MyApp.dll"]
    • Python: CMD ["python", "app.py"]
      Resultaat: De container voert automatisch het opgegeven commando uit bij opstarten.

Als je alle stappen hebt gevolg voor jouw applicatie krijg je een Dockerfile die hierop kan lijken:

# Voor een Node.js-app op poort 3000  
FROM node:18-alpine  
WORKDIR /app  
COPY package*.json ./  
RUN npm install  
COPY . .  
EXPOSE 3000  # Container luistert op poort 3000  
CMD ["node", "index.js"]  

Correctieve feedback tijdens de uitvoer

  • Build errors:
    • “Module not found” ➔ Controleer COPY-paden en .dockerignore als je dit gebruikt.
    • ”Permission denied” ➔ Voeg USER-instructies of voeg mogelijk chmod toe aan het RUN commando.

Tips voor efficiënt gebruik van Dockerfiles

  • Security: Gebruik --no-install-recommends bij apt-get en scan images met trivy
  • Caching: Scheid COPY package*.json ./ en RUN npm install van code-copy voor optimale cache

Tip

Reverse engineering van images: Gebruik docker inspect [image] om te zien hoe een image gebouwd is, inclusief Dockerfile-instructies.


Volgende stap: Uitleg Docker Compose