FROM, WORKDIR, COPY : les premières instructions d’un Dockerfile
Créez un dossier mini-carnet sur votre ordinateur, avec les deux fichiers du guide précédent dedans. Vous allez y ajouter un Dockerfile.
Créez, dans le dossier mini-carnet, un nouveau fichier nommé exactement Dockerfile, sans extension. C'est dans ce fichier que vous allez écrire, ligne après ligne, la construction de l'image.
FROM : partir d'une base existante
Une image ne se construit presque jamais à partir de rien. Elle part d'une image de base, déjà prête, sur laquelle on ajoute ce qui manque. C'est le rôle de l'instruction FROM, toujours la toute première ligne utile d'un Dockerfile.
Mini-Carnet a besoin de Node.js pour s'exécuter. Plutôt que d'installer Node.js vous-même sur une image vide, partez directement d'une image officielle qui le contient déjà :
node est le nom de l'image officielle Node.js sur Docker Hub. 22-alpine est un tag : il précise quelle version utiliser. alpine désigne une variante construite sur une distribution Linux très légère, ce qui donne une image de base nettement plus petite qu'une image Node.js complète. Vous reviendrez sur ce choix au guide 28, consacré à l'optimisation.
WORKDIR : choisir où travailler à l'intérieur de l'image
WORKDIR définit le dossier de travail à l'intérieur de l'image, un peu comme un cd qui s'appliquerait à toutes les instructions suivantes. Si ce dossier n'existe pas encore dans l'image, Docker le crée automatiquement.
À partir de cette ligne, toutes les instructions suivantes du Dockerfile s'exécutent depuis /app, à l'intérieur de l'image. C'est un choix de convention plutôt qu'une obligation : vous auriez pu choisir un autre nom, mais /app est extrêmement répandu et immédiatement reconnaissable dans un Dockerfile.
COPY : faire entrer vos fichiers dans l'image
Jusqu'ici, l'image ne contient que Node.js : aucun fichier de Mini-Carnet n'y est encore présent. L'instruction COPY copie des fichiers depuis votre ordinateur (l'endroit où se trouve le Dockerfile) vers l'intérieur de l'image en construction.
Cette ligne copie uniquement package.json, pas encore server.js. Le point final . signifie « dans le dossier de travail actuel », c'est-à-dire /app, défini juste avant par WORKDIR. Copier package.json seul, avant le reste du code, n'est pas un hasard : le guide suivant explique précisément pourquoi cet ordre compte.
FROM choisit la base, WORKDIR choisit où travailler à l'intérieur de cette base, COPY fait entrer vos propres fichiers. Ces trois instructions, dans cet ordre, forment le squelette de la quasi-totalité des Dockerfiles que vous croiserez.
Vérifiez que vous avez compris
Vous ajoutez la ligne COPY server.js . juste après WORKDIR /app, sans avoir défini WORKDIR avant. Ce fichier sera-t-il copié au même endroit que si WORKDIR /app avait été défini ?
Non. Sans WORKDIR défini au préalable, le dossier de travail par défaut à l'intérieur de l'image dépend de l'image de base utilisée, et n'est pas garanti d'être /app. C'est justement pour éviter cette incertitude que WORKDIR est défini explicitement avant toute instruction COPY.