Le problème que pose COPY . .

Au guide 12, l'instruction COPY . . copie tout le contenu du dossier où se trouve le Dockerfile vers l'intérieur de l'image. Le mot « tout » est à prendre au pied de la lettre : si ce dossier contient, par exemple, un dossier node_modules déjà présent sur votre ordinateur (généré par une précédente exécution de npm install en dehors de Docker), il sera copié aussi, en plus de celui que RUN npm install installe déjà à l'intérieur de l'image.

Ce doublon alourdit inutilement l'image, ralentit la construction, et peut même provoquer des comportements étranges si les fichiers copiés depuis votre ordinateur ne correspondent pas exactement à ceux installés à l'intérieur de l'image, par exemple s'ils ont été installés sur un système d'exploitation différent.

Le fichier .dockerignore

La solution ressemble beaucoup à un fichier que vous connaissez peut-être déjà si vous avez utilisé Git : .gitignore. Un fichier .dockerignore, placé à côté du Dockerfile, liste les fichiers et dossiers à exclure de toute instruction COPY, sans que le Dockerfile ait besoin de le savoir explicitement.

Créez ce fichier dans le dossier mini-carnet, à côté du Dockerfile. Avec ces quatre lignes, COPY . . ne copiera plus jamais node_modules (déjà géré par RUN npm install), ni le dossier .git d'un éventuel dépôt Git local, ni un fichier .env qui pourrait contenir des informations sensibles.

Un vrai enjeu de sécurité, pas juste de propreté

Un fichier .env contient souvent des informations sensibles : mots de passe, clés d'accès à un service externe. Sans .dockerignore, ce fichier pourrait se retrouver copié à l'intérieur d'une image, et donc potentiellement accessible à quiconque récupère cette image plus tard. Vous retrouverez ce sujet au guide 29, consacré à la sécurité.

Vérifiez que vous avez compris

Vous ajoutez node_modules à votre fichier .dockerignore. L'instruction RUN npm install du Dockerfile va-t-elle encore installer les dépendances de Mini-Carnet à l'intérieur de l'image ?

Oui, sans aucun changement. .dockerignore agit uniquement sur ce que les instructions COPY copient depuis votre ordinateur. RUN npm install continue d'installer les dépendances directement à l'intérieur de l'image, indépendamment de ce que contient votre propre dossier node_modules local, s'il en existe un.