1.3 Dockerfile - dkmattiUCLL/IT-Landscape GitHub Wiki

image

Dockerfile maken

Maak een file aan in het project waarin je Docker wilt integreren. Ik gebruik een kopie van een project uit de les Frontend gevorderd. Het is belangrijk dat je de file de exacte naam "DockerFile", zonder extensie en met een hoofdletter geeft.

image

Inhoud

De Dockerfile

Dit is hoe we de Dockerfile gaan opstellen. Hieronder zie je wat elke lijn precies doet.

image

FROM

De FROM in je dockerfile zoekt naar een base image. Dit is een image die al bestaat waarop je verderbouwt. Zo heb je bijvoorbeeld openJDK:17 om java te gebruiken als base image, en meerdere andere voorbeelden voor python etc.. Als voorbeeld project gebruik ik het Wereldklok project van programmeren gevorderd dat met node werkt. Ik gebruik versie 22.14.0 van node. Daarom gebruik ik als base image FROM node:22 (dit kan zelfs nog specifieker als het nodig is.).

image image

WORKDIR (/app/server) 1ste keer

WORKDIR vertelt je Dockerfile welke folder de working directory(de folder waarin je werkt) is. Als je de naam van een folder meegeeft die al bestaat, gebruikt de Dockerfile deze folder. Als de folder nog niet bestaat maakt Dockerfile ze aan. Wij kiezen voor de naam "app/server". De server voegen we er aan toe omdat onze .json bestanden in deze folder staan in ons project, en we deze boomstructuur willen behouden. Omdat we voor het absolute pad kiezen, geven we hier een "/" mee.

image

COPY (package*.json)

Deze lijn code zorgt ervoor dat de metadata van je dependencies gekopieerd worden naar de working directory. De "server/" voor de package*.json, wordt hier gezet omdat deze files een folder dieper zitten. De "./" zegt dat je dit naar de huidige folder moet kopiëren. Dat is dus de working directory. De rest van de bestanden worden nog niet mee gekopieerd. Dit zorgt ervoor dat als er aanpassingen gedaan worden, de dependencies niet elke keer opnieuw gedownload moeten worden in de RUN command. Het "*" teken betekent dat alle metadata die beginnen met package en eindigigen op .json, gekopieerd moet worden. BELANGRIJK: .json files zijn altijd metadata, niet de dependencies zelf.

RUN

RUN npm install installeert de dependencies die we net hebben meegegeven via de vorige COPY command. Dit zorgt ervoor dat de dependencies zelf nu in de image zitten. In het geval van node, belanden deze dependencies in een map genaamd node_modules. "./" wilt zeggen dat we deze in de working directory (app/server) installeren.

image

WORKDIR (/app) 2de keer

Omdat we in deze stap zowel de server als de client folder van het project willen kopiëren, is het belangrijk dat we dit niet in onze serverfolder doen. Daarom stappen we terug uit de serverfolder naar de centrale appfolder. Vanuit de folder "app", die overeen komt met het niveau van de Dockerfile in het project, is het makkelijk om zowel de server als clientfolder te kopiëren.



image

COPY (server)

We geven COPY deze keer twee parameters mee. Als eerste, de folder die gekopieerd moet worden. In dit geval is dat de serverfolder. De serverfolder bevindt zich op het zelfde niveau als wij ons nu bevinden, dus hier moet geen "./" voor. De WORKDIR van Dockerfile is op dit moment /app, maar wij willen de inhoud kopiëren naar de server folder dus schrijven we hier "./server" (current folder/folder in current folder). Omdat we docker zelf de dependencies laten installeren, is het belangrijk dat hij deze niet nog eens dubbel download uit ons project. Om dit te vermijden maken we een file aan met de naam: .dockerignore. In deze file schrijven we alles wat de Dockerfile niet moet kopiëren. In ons geval is dit de map node_modules deze maakt docker zelf aan.

image image

COPY (client)

We kopiëren de clientfolder op exact dezelfde manier als de serverfolder. Het enige grote verschil is dat de client folder nog niet bestaat. Wanneer we deze toch opgeven als tweede parameter, controleert de Dockerfile eerst of deze folder al bestaat. Als dit zoals in onze situatie, niet het geval is, dan maakt hij de folder zelf nog aan.

EXPOSE

Met EXPOSE geef je de poort mee waarop de applicatie mag runnen. In mijn geval is dat poort 2025.

CMD

CMD staat voor command. Wat je hier in steekt is wat je wilt dat je container als eerste doet wanneer hij gestart wordt. In veel gevallen is dit npm start. We hadden dit ook kunnen doen door nog één keer van WORKDIR te veranderen, aangezien de relevante files om deze command te kunnen uitvoeren in de serverfolder staan. In de plaats daarvan geven wij de command die nmp start ook zou geven, rechtstreeks in. In de syntax van docker geef je dit mee als de command die je wilt uitvoeren en dan de parameter, dus ["npm", "server/server.js"].Concreet betekent dit dat Node een server start aan de hand van het server.js bestand, dat tenopzichte van de WORKDIR in de folder "server" zit.

image

image image

⚠️ **GitHub.com Fallback** ⚠️