Een Dockerfile is een tekstbestand met instructies. Deze worden gebruikt om een Docker Image te bouwen. In een Dockerfile staat stap voor stap beschreven hoe de image wordt samengesteld, inclusief de base image (bepaalt de OS), afhankelijkheden, configuraties en startcommando’s.
Casus
Een ontwikkelaar wil een Python-webapplicatie in een container draaien. Door een Dockerfile te schrijven, kan hij ervoor zorgen dat alle benodigde dependencies automatisch worden geïnstalleerd en dat de applicatie in elke omgeving op dezelfde manier werkt.
Hoe zit een Dockerfile in elkaar?
Een Dockerfile is een tekstbestand zonder extensie die je het beste in de map met je applicatie kan zetten. Dit bestand moet ook “Dockerfile” genoemd worden. Een Dockerfile bestaat uit verschillende instructies die bepalen hoe een image wordt opgebouwd. Veelgebruikte instructies zijn:
FROM
Definieert de base image en is altijd de eerste regel in een Dockerfile. Deze base images zijn te vinden op Docker Huben zijn gespecialiseerd in verschillende tools, programmeertalen en operating systems.
WORKDIR
Hiermee kan je de folder instellen van waaruit alle volgende commandos worden uitgevoerd. Als de folder nog niet bestaat, wordt deze aangemaakt.
COPY
Het copy commando kopieert bestanden vanaf jouw machine naar de image. Wanneer je copy . . uitvoert, worden de bestanden van de folder waar de Dockerfile in zit, gekopieerd naar de workdir. Daarom is het handig om de Dockerfile in hetzelfde mapje als de applicatie te stoppen waar je een image van wilt maken. Als je niet alles wilt kopiëren, dan kan je een .dockerignore bestand aanmaken met daarin de uitzonderingen.
EXPOSE
Het EXPOSE commando geeft aan op welke poort de container luistert, maar stelt deze niet automatisch open naar de host. Dit is puur documentatie binnen de image en helpt andere gebruikers te begrijpen welke poort in de container wordt gebruikt. Bijvoorbeeld, EXPOSE 80.
RUN
Run voert de daarna meegegeven commando’s uit tijdens het bouwen van de image. Vaak wordt dit gebruikt voor het installeren van dependencies en het compileren van de code.
CMD
Vergelijkbaar met RUN, kan je met CMD commando’s activeren. Commando’s gedefinieerd met CMD worden alleen pas geactiveerd wanneer de container wordt gemaakt van de image. Meestal wordt dit gebruikt om de executable van de applicatie te activeren. Bij de andere commandos worden spaties gebruikt om argumenten te scheiden, maar bij CMD word dit in een array formaat gedaan. Dat ziet er dan zo uit: ["arg1", "arg2"].
Codevoorbeeld
# Gebruik een officiële Python base imageFROM python:3.9# Stel de werkdirectory inWORKDIR /app# Kopieer de vereiste bestanden naar de containerCOPY requirements.txt .# Installeer de benodigde dependenciesRUN pip install -r requirements.txt# Kopieer de rest van de applicatieCOPY . .# Start de applicatieCMD ["python", "app.py"]
Hoe gebruik je een Dockerfile?
Een Dockerfile wordt gebruikt om een image te bouwen die vervolgens als container kan worden uitgevoerd. Dit maakt het mogelijk om applicaties te packagen en overal te draaien zonder afhankelijk te zijn van het onderliggende besturingssysteem.
Casus
Een team ontwikkelt een Node.js-applicatie en wil deze eenvoudig kunnen deployen naar verschillende omgevingen.
Eisen voor de oplossing:
De applicatie moet draaien in een gestandaardiseerde omgeving.
Alle dependencies moeten automatisch worden geïnstalleerd.
De container moet eenvoudig kunnen worden gedeployed.