Wat is een Dockerfile?

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 image
FROM python:3.9
 
# Stel de werkdirectory in
WORKDIR /app
 
# Kopieer de vereiste bestanden naar de container
COPY requirements.txt .
 
# Installeer de benodigde dependencies
RUN pip install -r requirements.txt
 
# Kopieer de rest van de applicatie
COPY . .
 
# Start de applicatie
CMD ["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.

Mogelijke uitwerking van de casus

FROM node:16
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "server.js"]

Bronnen

Dockerhub: https://hub.docker.com/search?badges=official


Volgende stap: Stappen Dockerfile