Kennisbank › Docker › dockerfile: Docker
docker starter 22 September 2026

dockerfile: Docker

Un Dockerfile est un fichier texte qui contient des instructions pour construire une image Docker. Il constitue la base de l'automatisation de la création

Un Dockerfile est un fichier texte qui contient des instructions pour construire une image Docker. Il constitue la base de l'automatisation de la création d'images de conteneurs, ce qui permet aux développeurs et aux systèmes de mettre en place des environnements de manière cohérente et reproductible. Les Dockerfiles sont essentiels dans le monde des conteneurs, car ils augmentent la transparence, la réutilisabilité et la gestion des versions des environnements logiciels. Ils font partie d'un workflow plus large dans lequel Docker sert de plateforme pour empaqueter, distribuer et exécuter des applications.

Un Dockerfile commence généralement par une instruction `FROM`, qui indique quelle image de base est utilisée pour la nouvelle image de conteneur. Cette image de base peut être une distribution Linux minimale, comme Alpine ou Ubuntu, ou une image déjà spécifiquement configurée comme `node:18` ou `python:3.11`. En utilisant une image existante, le développeur ne doit pas partir de zéro. Au lieu de cela, le Dockerfile s'appuie sur une couche existante, sur laquelle des adaptations sont ensuite apportées. C'est une manière efficace de travailler, car Docker réutilise les couches d'image lorsqu'elles n'ont pas changé, ce qui raccourcit le temps de build.

Après l'instruction `FROM`, diverses autres instructions Dockerfile peuvent être ajoutées. L'une d'elles est `RUN`, qui permet d'exécuter des commandes pendant le processus de build de l'image. Par exemple : `RUN apt-get update && apt-get install -y curl`. Cette commande s'exécute sur le système de fichiers existant de l'image de conteneur et ajoute le logiciel installé sous forme de nouvelle couche. Chaque instruction `RUN` aboutit à une couche distincte au sein de l'image. Comme les images Docker sont constituées de couches immuables, cela signifie que chaque modification ajoute une nouvelle couche par-dessus la précédente. Ce principe est central dans le fonctionnement de Docker et assure l'efficacité lors de la mise en cache et de la distribution des images.

Outre `RUN`, il existe d'autres instructions couramment utilisées comme `COPY` et `ADD`. `COPY` est utilisé pour copier des fichiers ou des dossiers de la machine locale vers le système de fichiers du conteneur. Par exemple : `COPY app.js /app/`. C'est une manière simple et transparente de placer du code d'application dans l'image. `ADD` fait des choses similaires, mais dispose de fonctionnalités supplémentaires, comme l'extraction automatique de fichiers compressés (comme `.tar` ou `.gz`) lorsqu'ils sont copiés. Bien que `ADD` soit puissant, il est souvent recommandé d'utiliser `COPY`, car il est plus clair de voir ce qui se passe et le comportement est plus prévisible.

Une autre instruction importante est `CMD`. Celle-ci détermine quelle commande est exécutée par défaut lorsqu'un conteneur est démarré à partir de l'image. Par exemple : `CMD ["node", "app.js"]`. Cela signifie qu'au démarrage du conteneur, le runtime Node.js est automatiquement appelé avec le script `app.js`. Il est important de noter que `CMD` peut être écrasé lorsque `docker run` est appelé avec une commande alternative. Si une image est par exemple construite avec `CMD ["python", "app.py"]`, mais qu'au démarrage on utilise `docker run mijn-image echo "hallo"`, alors `echo "hallo"` est exécuté à la place de `python app.py`.

En outre, il existe l'instruction `ENTRYPOINT`, qui est souvent utilisée conjointement avec `CMD`. `ENTRYPOINT` définit une commande fixe qui est toujours exécutée, après quoi `CMD` sert d'argument par défaut. C'est pratique pour créer des outils utilisés comme commandes, comme un outil CLI. Par exemple : `ENTRYPOINT ["/bin/my-tool"]` et `CMD ["--help"]`. Dans ce cas, avec `docker run mijn-image`, c'est automatiquement `/bin/my-tool --help` qui est exécuté. Si toutefois vous utilisez `docker run mijn-image --version`, c'est `/bin/my-tool --version` qui est exécuté, parce que `--version` écrase `CMD`.

D'autres instructions sont `EXPOSE`, `ENV`, `WORKDIR` et `LABEL`. `EXPOSE` indique quels ports le conteneur utilisera pendant l'exécution, par exemple `EXPOSE 8080`. C'est informatif et cela aide à configurer les réseaux, mais cela n'ouvre pas automatiquement le port — cela ne se produit qu'au démarrage du conteneur avec `docker run -p`. `ENV` définit des variables d'environnement, comme `ENV NODE_ENV=production`, qui sont disponibles pendant le build et l'exécution du conteneur. `WORKDIR` définit le répertoire de travail courant pour toutes les instructions suivantes (`RUN`, `CMD`, `COPY`, etc.), ce qui facilite la gestion des chemins. `LABEL` est utilisé pour ajouter des métadonnées à l'image, comme l'auteur, la version ou la description, ce qui est utile pour la gestion et la documentation.

La construction d'une image à partir d'un Dockerfile se fait avec la commande `docker build`. Cette commande prend un contexte de build (généralement le répertoire courant) et traite les instructions du Dockerfile étape par étape. Pendant le build, chaque instruction est créée sous forme de couche distincte. Docker utilise la mise en cache pour travailler efficacement : si une couche a déjà été construite auparavant et que les fichiers sources et les instructions n'ont pas changé, la version mise en cache est utilisée au lieu d'être réexécutée. Cela accélère considérablement le processus de build, surtout lors de builds répétés.

La structure d'un Dockerfile suit généralement un ordre logique : d'abord l'image de base, ensuite les adaptations système (comme l'installation de paquets), puis la copie du code d'application, et enfin la définition des instructions de démarrage (`CMD` ou `ENTRYPOINT`). En suivant cet ordre, on maximise les avantages de la mise en cache. Par exemple : si seul le code d'application change, les couches précédentes (comme l'installation des paquets) ne doivent pas être retraitées, parce que Docker voit que cette étape est identique à un build précédent.

Il existe également des techniques avancées dans les Dockerfiles, comme l'utilisation de `.dockerignore`. Ce fichier fonctionne comme `.gitignore` et détermine quels fichiers et dossiers ne sont pas inclus dans le contexte de build. C'est important pour les performances et la sécurité, car cela évite que des fichiers inutiles ou sensibles (comme des fichiers de log ou une configuration avec des mots de passe) soient accidentellement inclus dans l'image.

En outre, il est possible d'utiliser plusieurs stages dans un seul Dockerfile, une technique connue sous le nom de *multi-stage builds*. C'est pratique pour, par exemple, construire une application dans un environnement disposant de tous les outils de développement, mais ne reprendre que les fichiers exécutables compilés vers une image d'exécution légère. On peut ainsi utiliser une grande image de build pour compiler le code, mais garder l'image finale petite en copiant uniquement les binaires nécessaires. Cela réduit la taille de l'image et améliore la sécurité, car aucun outil de compilation ni code source ne se trouve dans l'image finale.

Les Dockerfiles ne sont pas seulement techniques, ils font aussi partie d'un workflow plus large de développement logiciel. Ils s'intègrent bien dans les pipelines CI/CD, où chaque commit de code conduit automatiquement à la construction et au test d'une nouvelle image de conteneur. La documentation Docker Docs mentionne par exemple la transition des Docker Hub Automated Builds vers des workflows CI comme GitHub Actions et Bitbucket Pipelines. Cela signifie que les Dockerfiles sont aujourd'hui souvent utilisés dans des systèmes automatisés, où l'accès à Docker Hub est géré via des access tokens, comme décrit dans le guide de migration.

Enfin, il est important de noter que les Dockerfiles sont open source et font partie de l'écosystème plus large des conteneurs et des technologies cloud-native. Ils sont pris en charge par des outils comme Podman Desktop, qui offre une interface graphique pour utiliser les Dockerfiles afin de construire des images, démarrer des conteneurs et gérer des workloads Kubernetes. Bien que Docker soit la plateforme la plus connue, il existe des alternatives comme Podman, qui prennent en charge le même format de fichier et les mêmes instructions, ce qui augmente la portabilité.

En bref, un Dockerfile est une recette puissante, basée sur du texte, pour construire des images de conteneurs. Il utilise une série d'instructions définies pour construire un système de fichiers étape par étape, chaque étape formant une nouvelle couche. En exploitant les principes des couches immuables, de la mise en cache et de la réutilisabilité, un Dockerfile bien écrit assure l'efficacité, la cohérence et l'évolutivité dans le développement logiciel moderne. C'est un élément fondamental du monde des conteneurs et indispensable pour quiconque travaille avec Docker, Podman ou d'autres plateformes de conteneurs.

← Terug naar kennisbank
← Terug naar kennisbank