Un Dockerfile est un fichier de configuration qui définit comment construire une image Docker. Il contient une série d'instructions qui sont exécutées dans l'ordre pour créer un environnement reproductible. Voici une liste des éléments les plus courants dans un Dockerfile, leur utilité et les options associées.

1. FROM – 📩 DĂ©finir l'image de base

L'instruction FROM définit l'image de base à utiliser pour construire l'image Docker.

FROM ubuntu:20.04

Options courantes :

  • <image>:<tag> : SpĂ©cifie une image et un tag (par exemple, alpine:latest).
  • AS <name> : DĂ©finit un alias pour une image intermĂ©diaire utilisĂ©e dans un build multi-Ă©tape.

Exemple :

FROM node:18 AS builder

2. RUN – ⚡ ExĂ©cuter des commandes

L'instruction RUN exécute des commandes durant la construction de l'image.

RUN apt-get update && apt-get install -y curl

Options courantes :

  • --mount=type=cache,target=<dir> : Permet de mettre en cache certains fichiers pour optimiser le build.

Exemple :

RUN --mount=type=cache,target=/root/.cache apt-get update

3. COPY – 📂 Copier des fichiers locaux

COPY permet de copier des fichiers ou dossiers locaux dans l'image.

COPY . /app

Options courantes :

  • --chown=<user>:<group> : Change le propriĂ©taire des fichiers copiĂ©s.
  • --from=<stage> : Permet de copier des fichiers d’un autre build stage.

Exemple :

COPY --from=builder /app/dist /app

4. ADD – 📩 Ajouter des fichiers avec extraction automatique

ADD est similaire Ă  COPY, mais il supporte aussi l'extraction des archives.

ADD my-archive.tar.gz /app

Remarque : COPY est souvent préféré à ADD, sauf si l'on a besoin d'extraire un fichier compressé automatiquement.


5. WORKDIR – 📁 DĂ©finir le rĂ©pertoire de travail

Définit le répertoire de travail pour les instructions suivantes.

WORKDIR /app

6. ENV – 🌍 DĂ©finir des variables d'environnement

Permet de dĂ©finir des variables d’environnement accessibles dans le conteneur.

ENV NODE_ENV=production

7. EXPOSE – 🔌 Documenter les ports utilisĂ©s

EXPOSE indique les ports sur lesquels le conteneur va écouter.

EXPOSE 3000

8. CMD – 🚀 DĂ©finir la commande par dĂ©faut

CMD définit la commande exécutée lorsque le conteneur démarre.

CMD ["node", "app.js"]

9. ENTRYPOINT – 🎯 DĂ©finir un point d’entrĂ©e

ENTRYPOINT permet de définir une commande fixe qui sera toujours exécutée.

ENTRYPOINT ["/entrypoint.sh"]

10. VOLUME – đŸ’Ÿ DĂ©clarer un volume

VOLUME permet de persister des données en dehors du cycle de vie du conteneur.

VOLUME /data

11. ARG – 🔧 DĂ©finir des variables pour le build

ARG permet de passer des variables au moment du build.

ARG APP_VERSION=1.0.0

12. LABEL – đŸ·ïž Ajouter des mĂ©tadonnĂ©es

LABEL permet d’ajouter des informations descriptives à l’image.

LABEL maintainer="mon-email@example.com"

13. HEALTHCHECK – ❀ VĂ©rifier la santĂ© du conteneur

HEALTHCHECK permet de définir une commande pour vérifier si un conteneur est toujours fonctionnel.

HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
  CMD curl -f http://localhost:3000 || exit 1

14. USER – đŸ‘€ Changer l’utilisateur d’exĂ©cution

USER permet d’exĂ©cuter le conteneur avec un utilisateur spĂ©cifique.

USER 1000:1000

15. ONBUILD – 🔄 ExĂ©cuter une commande pour les builds dĂ©rivĂ©s

ONBUILD permet d’exĂ©cuter une commande lorsque l’image est utilisĂ©e comme base pour une autre.

ONBUILD COPY . /app

📜 Exemple complet d’un Dockerfile

FROM node:18

WORKDIR /app

COPY package.json .
RUN npm install

COPY . .

EXPOSE 3000
CMD ["node", "server.js"]

🎯 Conclusion

Un Dockerfile bien structurĂ© permet d’optimiser la crĂ©ation d’images Docker et d’amĂ©liorer leur maintenabilitĂ©. L’utilisation judicieuse des instructions permet de rendre les builds plus rapides, lĂ©gers et sĂ©curisĂ©s.

Si vous avez des questions ou des suggestions, n’hĂ©sitez pas Ă  laisser un commentaire ! 🚀🐳

Un Dockerfile est un fichier de configuration qui définit comment construire une image Docker. Il contient une série d'instructions qui sont exécutées dans l'ordre pour créer un environnement reproductible. Voici une liste des éléments les plus courants dans un Dockerfile, leur utilité et les options associées.

1. FROM – DĂ©finir l'image de base

L'instruction FROM définit l'image de base à utiliser pour construire l'image Docker.

FROM ubuntu:20.04

Options courantes :

  • <image>:<tag> : SpĂ©cifie une image et un tag (par exemple, alpine:latest).
  • AS <name> : DĂ©finit un alias pour une image intermĂ©diaire utilisĂ©e dans un build multi-Ă©tape.

Exemple :

FROM node:18 AS builder

2. RUN – ExĂ©cuter des commandes

L'instruction RUN exécute des commandes durant la construction de l'image.

RUN apt-get update && apt-get install -y curl

Options courantes :

  • --mount=type=cache,target=<dir> : Permet de mettre en cache certains fichiers pour optimiser le build.

Exemple :

RUN --mount=type=cache,target=/root/.cache apt-get update

3. COPY – Copier des fichiers locaux

COPY permet de copier des fichiers ou dossiers locaux dans l'image.

COPY . /app

Options courantes :

  • --chown=<user>:<group> : Change le propriĂ©taire des fichiers copiĂ©s.
  • --from=<stage> : Permet de copier des fichiers d’un autre build stage.

Exemple :

COPY --from=builder /app/dist /app

4. ADD – Ajouter des fichiers avec extraction automatique

ADD est similaire Ă  COPY, mais il supporte aussi l'extraction des archives.

ADD my-archive.tar.gz /app

Remarque : COPY est souvent préféré à ADD, sauf si l'on a besoin d'extraire un fichier compressé automatiquement.


5. WORKDIR – DĂ©finir le rĂ©pertoire de travail

Définit le répertoire de travail pour les instructions suivantes.

WORKDIR /app

Remarque : Il est prĂ©fĂ©rable d’utiliser WORKDIR plutĂŽt que RUN cd /app && ... pour Ă©viter des erreurs de contexte.


6. ENV – DĂ©finir des variables d'environnement

Permet de dĂ©finir des variables d’environnement accessibles dans le conteneur.

ENV NODE_ENV=production

7. EXPOSE – Documenter les ports utilisĂ©s

EXPOSE indique les ports sur lesquels le conteneur va écouter.

EXPOSE 3000

Remarque : EXPOSE ne publie pas réellement le port, il sert juste à la documentation. Il faut utiliser docker run -p 3000:3000 pour exposer un port.


8. CMD – DĂ©finir la commande par dĂ©faut

CMD définit la commande exécutée lorsque le conteneur démarre.

CMD ["node", "app.js"]

Remarque : CMD est souvent utilisé pour exécuter un programme par défaut. Si un argument est fourni lors du docker run, il remplace CMD.


9. ENTRYPOINT – DĂ©finir un point d’entrĂ©e

ENTRYPOINT permet de définir une commande fixe qui sera toujours exécutée.

ENTRYPOINT ["/entrypoint.sh"]

Différence entre CMD et ENTRYPOINT

  • CMD peut ĂȘtre remplacĂ© en ligne de commande (docker run mon-image bash).
  • ENTRYPOINT force l’exĂ©cution d’une commande spĂ©cifique (utilisĂ© par exemple pour des conteneurs comme nginx).

10. VOLUME – DĂ©clarer un volume

VOLUME permet de persister des données en dehors du cycle de vie du conteneur.

VOLUME /data

11. ARG – DĂ©finir des variables pour le build

ARG permet de passer des variables au moment du build.

ARG APP_VERSION=1.0.0

Utilisation avec docker build :

docker build --build-arg APP_VERSION=2.0.0 .

12. LABEL – Ajouter des mĂ©tadonnĂ©es

LABEL permet d’ajouter des informations descriptives à l’image.

LABEL maintainer="mon-email@example.com"

13. HEALTHCHECK – VĂ©rifier la santĂ© du conteneur

HEALTHCHECK permet de définir une commande pour vérifier si un conteneur est toujours fonctionnel.

HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
  CMD curl -f http://localhost:3000 || exit 1

14. USER – Changer l’utilisateur d’exĂ©cution

USER permet d’exĂ©cuter le conteneur avec un utilisateur spĂ©cifique.

USER 1000:1000

15. ONBUILD – ExĂ©cuter une commande pour les builds dĂ©rivĂ©s

ONBUILD permet d’exĂ©cuter une commande lorsque l’image est utilisĂ©e comme base pour une autre.

ONBUILD COPY . /app

Exemple complet d’un Dockerfile

FROM node:18

WORKDIR /app

COPY package.json .
RUN npm install

COPY . .

EXPOSE 3000
CMD ["node", "server.js"]

Conclusion

Un Dockerfile bien structurĂ© permet d’optimiser la crĂ©ation d’images Docker et d’amĂ©liorer leur maintenabilitĂ©. L’utilisation judicieuse des instructions permet de rendre les builds plus rapides, lĂ©gers et sĂ©curisĂ©s.