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:
Doel Dockerfile Instructie Resultaat in Image 1. Aanmaken Dockerfile Maak in je projectmap een bestand zonder extensie DockerfileLege Dockerfile klaar voor instructies 2. Selecteren van een basisimage FROM node:18-alpineMinimale Node.js runtime-omgeving 3. Inrichten van een werkdirectory WORKDIR /appVolgende commando’s draaien in /app4. Kopiëren van bestanden dockerfile<br>COPY package*.json ./<br>COPY src/ ./src/package.json, lockfiles én broncode in de image5. Installeren van afhankelijkheden RUN npm ci --productionGepinde npm-packages geïnstalleerd 6. Exposen van poorten EXPOSE 3000Poort 3000 open voor inkomend verkeer 7. Definiëren van een startcommando CMD ["node", "src/index.js"]Container start je API automatisch bij opstarten
3. Fasen
-
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.
-
Base Image Definiëren
Actie: Selecteer een officiële base image die past bij je applicatie (bijv.python:3.11-slimofalpine). Deze base images zijn te vinden op Docker Hub. Zet het commandoFROMmet daarachter de naam van de base image in bovenaan de Dockerfile om deze te gebruiken. Resultaat: Een schone, gestandaardiseerde basis. -
Werkomgeving Configureren
Actie: Plaats het commandoWORKDIRmet 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/appzijn. Resultaat: Een pad waar binnen de container waar de volgende commandos op uitgevoerd worden. -
**Bestanden Kopiëren
Actie: Gebruik hetCOPY-commando om projectbestanden vanaf je pc naar de image te kopiëren wanneer deze gebouwd wordt. Je kan bijvoorbeeldCOPY . .gebruiken om alle bestanden naar de directory te kopiëren. Resultaat: Alle benodigde bestanden (code, configuraties) zijn in de image aanwezig. -
Afhankelijkheden Installeren en Build-stappen
Actie: GebruikRUNom:- Afhankelijkheden te installeren (bijv.
RUN npm installvoor JavaScript ofRUN pip install -r requirements.txtvoor Python). - De applicatie te bouwen (bijv.
RUN npm run buildvoor een React-app ofRUN dotnet publish -c Releasevoor C#).
Resultaat: Afhankelijkheden zijn geïnstalleerd en de applicatie is klaar voor gebruik.
- Afhankelijkheden te installeren (bijv.
Tip
Plaats dit na het kopiëren van dependency-bestanden om Docker’s cache optimaal te benutten.
-
Poort Exposen
Actie: Gebruik hetEXPOSE-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 metEXPOSE 5000.
Resultaat: Docker weet welke poorten relevant zijn voor de applicatie. -
Startcommando Definiëren (CMD)
Actie: GebruikCMDom 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.
- JavaScript:
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.dockerignoreals je dit gebruikt. - ”Permission denied” ➔ Voeg
USER-instructies of voeg mogelijkchmodtoe aan het RUN commando.
- “Module not found” ➔ Controleer
Tips voor efficiënt gebruik van Dockerfiles
- Security: Gebruik
--no-install-recommendsbijapt-geten scan images mettrivy - Caching: Scheid
COPY package*.json ./enRUN npm installvan 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
