Dockerfiles
Op deze pagina:
Een Dockerfile maken
Een Dockerfile beschrijft hoe je applicatie moet draaien door het installeren van de benodigde software en het kopiëren van bestanden.
Een voorbeeld voor de Apache webserver:
FROM httpd:latest
RUN echo "LoadModule headers_module modules/mod_headers.so" >> /usr/local/apache2/conf/httpd.conf
COPY .htaccess /var/www/html/.htaccess
COPY index.html /var/www/html/index.html
COPY css/ /var/www/html/css
De FROM regel bepaalt de basis image. In dit geval is dit de officiële Apache image. Docker voert de rest van de instructies in je Dockerfile uit op de basis image.
De RUN regel voert een opdracht uit in de container. Dit kan elke opdracht zijn die in de omgeving van de container beschikbaar is. In dit voorbeeld worden de "headers" geladen die gebruikt kunnen worden door het ".htaccess" bestand voor het instellen van omleidingsregels.
De COPY regels kopiëren bestanden die nodig zijn voor het weergeven van de website.
Een voorbeeld voor Ubuntu:
FROM ubuntu:22.04
RUN echo 'APT::Install-Suggests "0";' >> /etc/apt/apt.conf.d/00-docker
RUN echo 'APT::Install-Recommends "0";' >> /etc/apt/apt.conf.d/00-docker
RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y python3 && rm -rf /var/lib/apt/lists/*
RUN useradd -ms /bin/bash gebruiker
USER gebruiker
Ubuntu 22.04 is een LTS (Long Term Support) uitgave van Ubuntu. LTS uitgaven en bijbehorende Docker images worden 5 jaar lang ondersteund door Canonical.
De regels in de Dockerfile die beginnen met 'RUN echo' zorgen ervoor dat de Docker image kleiner blijft door de optionele onderdelen en hun afhankelijheden niet te installeren.
De regel die begint met 'RUN DEBIAN_FRONTEND=noninteractive' stelt een tijdelijke environment variabele in die alleen op deze regel geldig is. Deze 'RUN DEBIAN_FRONTEND=noninteractive' voorkomt foutmeldingen als dialoogvensters niet kunnen worden geopend doordat de opdrachten in een Dockerfile staan in plaats van dat je ze handmatig via een opdrachtprompt invoert. Op deze regel worden ook de pakketlijst en de pakketten geupdate, wordt Python geinstalleerd en worden tenslotte de pakketlijsten weer verwijderd aangezien deze niet meer nodig zijn en alleen maar onnodig opslagruimte in beslag nemen.
De regel die begint met 'RUN useradd' voegt een gebruiker toe zonder dat je om gegevens voor die gebruiker wordt gevraagd. Deze nieuwe gebruiker (hier met als naam 'gebruiker') wordt met 'USER gebruiker' als de standaard gebruiker ingesteld voor deze container zodat je in deze container niet automatisch als root werkt.
De opdrachten die je kunt gebruiken in een Dockerfile
Een dockerfile is een bestand met een lijst met instructies voor het maken van een image. Deze instructies bevatten opdrachten zoals het instellen van environment variabelen, het kopiëren van bestanden naar de image en andere opdrachten die uitgevoerd moeten worden.
RUN: Voert een opdracht uit in een nieuwe laag bovenop de basis image.
Voorbeeld van een RUN opdracht:
RUN apt install python3 -y
LABEL: Voegt metadata toe aan een image die met de docker image inspect opdracht bekeken kan worden.
Voorbeeld dat een versienummer toevoegt aan een image:
LABEL version="3.0"
Alhoewel LABELs vrij te gebruiken zijn, is het aan te raden om de Pre-Defined Annotation Keys te gebruiken om te zorgen dat je LABELs bruikbaar zijn in gereedschappen die op LABELs filteren.
ENV: Stelt een environment variabele in een image in. Het eerste argument is de naam van de environment variabele en het tweede argument is de waarde van deze environment variabele. Deze environment variabele kan dan gebruikt worden door applicaties in de image.
Voorbeeld van een environment variabele die met de ENV instructie wordt ingesteld:
ENV PATH /usr/local/nginx/bin:$PATH
ADD: Kopiëert bestanden of directories van de locatie op de host of een "url" (het eerste argument) naar het bestandssysteem van de container (het tweede argument).
De ADD en COPY instructies lijken op elkaar. De ADD instructie heeft extra functionaliteit, je kunt bijvoorbeeld een "tar" bestand automatisch uitpakken in de image:
ADD rootfs.tar.xz /.
ADD heeft geen --from vlag, je kunt wel de chown vlag gebruiken. ADD kan ook bestanden via een opgegeven url downloaden en in de container plaatsen.
VOLUME: Stelt een koppelpunt in (mount point) met de opgegeven naam en koppelt dat koppelpunt van de container aan een automatisch gegenereerde locatie op de host (bijvoorbeeld in /var/lib/docker/volumes). Het kan gebruikt worden om gegevens te delen tussen container en host, bijvoorbeeld om gegevens, logs of configuratiebestanden te bewaren. De naam van een gekoppeld volume op de host wordt automatisch gegenereerd en is lang en niet in de vorm die iets betekent voor een mens, daarom wordt naar deze volumes ook wel verwezen als "unnamed" of "anonymous". Je geeft dus alleen de naam op van de naam van het koppelpunt in de container.
Voorbeeld met '/vol1' als het koppelpunt in de container:
VOLUME /vol1
WORKDIR: Stelt de werkdirectory in voor elke RUN, CMD, ENTRYPOINT, COPY en ADD instructie die erna komt in de Dockerfile.
Voorbeeld met '/scripts' als de nieuwe werkdirectory:
WORKDIR /scripts
ONBUILD: Voegt een trigger instructie toe aan de image die uitgevoerd wordt als de image gebruikt wordt als basis voor een andere build.
Als voorbeeld een instructie om de directory met de inhoud van de (eigen) website leeg te maken zodat deze niet gebruikt wordt in andere docker images.
ONBUILD RUN rm -rf /var/www/html/*
SHELL: Stelt een andere shell in als de default shell. Dit kan bijvoorbeeld gebruikt worden om op een Windows systeem de shell aan te passen naar Powershell in plaats van CMD. Op een Linux systeem is dit standaard [“/bin/sh”, “-c”].