3.1 Instruction FROM
Alors, pour rappel, un Dockerfile, c’est un fichier texte qui contient des instructions pour créer une image Docker. Chaque instruction dans un Dockerfile effectue une tâche spécifique et crée une nouvelle couche dans l’image. Dans cette leçon, on va détailler les instructions principales de Dockerfile : FROM
, RUN
, COPY
et CMD
, qui sont essentielles pour créer des images Docker fonctionnelles et efficaces.
L’instruction FROM
définit l’image de base à partir de laquelle sera créée la nouvelle image. C’est la première instruction de n’importe quel Dockerfile, et elle détermine le point de départ pour construire l’image.
Synthaxe
FROM <image>[:<tag>] [AS <name>]
Où :
<image>
: le nom de l’image de base.<tag>
: (optionnel) la version de l’image de base. Par défaut, c’estlatest
.AS <name>
: (optionnel) attribution d’un nom pour cette étape de build (utilisé dans le multi-stage build).
Exemples
Utilisation de l’image de base Ubuntu
:
FROM ubuntu:20.04
Utilisation de l’image officielle Node.js
:
FROM node:14
Utilisation d’un multi-stage build pour optimiser :
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
Dans cet exemple, deux images de base sont utilisées. La première (node:14) est utilisée pour construire l’application, et la seconde (nginx:alpine) sert à créer un serveur léger qui va servir les fichiers statiques.
Grâce à l’utilisation du multi-stage build, l’image finale contient seulement le minimum nécessaire de fichiers et de programmes (dans ce cas Nginx
et les fichiers statiques construits), ce qui la rend plus légère et plus rapide à déployer.
3.2 Instruction RUN
L'instruction RUN
exécute des commandes dans le conteneur et crée une nouvelle couche dans l'image. Cette instruction est utilisée pour installer des packages, configurer l'environnement et exécuter d'autres commandes nécessaires à la préparation de l'image.
Syntaxe :
RUN <command>
Où :
<command>
: la commande qui sera exécutée dans le conteneur.
Exemples :
Installation des packages dans une image Ubuntu :
RUN apt-get update && apt-get install -y curl git
Compilation de code :
RUN gcc -o myapp myapp.c
Combiner plusieurs commandes
Pour réduire le nombre de couches, diminuer la taille de l'image
et accélérer la construction, il est recommandé de combiner plusieurs commandes dans une seule instruction RUN
.
RUN apt-get update \
&& apt-get install -y curl git \
&& rm -rf /var/lib/apt/lists/*
3.3 Instruction COPY
Instruction COPY
copie des fichiers et des répertoires depuis le contexte de build vers le système de fichiers du conteneur. C'est utile pour transférer le code source, les fichiers de configuration et d'autres ressources dans le conteneur.
Syntaxe :
COPY <src> <dest>
Où :
-
<src>
: chemin vers les fichiers ou répertoires dans le contexte de build. <dest>
: chemin de destination dans le conteneur.
Exemples :
Copie de tout le contenu du répertoire actuel dans le répertoire de travail du conteneur :
COPY . /app
Copie de fichiers individuels :
COPY package.json /app/package.json
COPY server.js /app/server.js
Utilisation de .dockerignore
Pour exclure les fichiers inutiles du processus de copie, on peut utiliser un fichier .dockerignore
, qui fonctionne de manière similaire à .gitignore
.
node_modules
dist
*.log
3.4 Instruction CMD
L'instruction CMD
définit une commande qui sera exécutée au démarrage du conteneur. Contrairement à RUN
, qui s'exécute au moment de la construction, CMD
s'exécute lorsque le conteneur démarre à partir de l'image créée.
Syntaxe :
CMD ["executable","param1","param2"]
Ou
CMD command param1 param2
Où :
- ["executable","param1","param2"]: forme exec, préférable pour garantir un bon traitement des signaux.
- command param1 param2: forme
shell
, qui exécute la commande dans un shell.
Exemples :
Lancer une application Node.js
:
CMD ["node", "app.js"]
Lancer un script shell
:
CMD /usr/bin/myscript.sh
Différence entre CMD
et ENTRYPOINT
CMD
définit une commande par défaut, qui peut être remplacée au démarrage du conteneur. ENTRYPOINT
définit une commande immuable qui sera toujours exécutée au démarrage du conteneur.
Exemple d'utilisation de ENTRYPOINT
:
ENTRYPOINT ["python", "script.py"]
CMD ["arg1"]
Dans cet exemple, ENTRYPOINT
lance le script Python, tandis que CMD
fournit des arguments qui peuvent être modifiés au démarrage du conteneur.
Exemple Dockerfile avec les instructions principales
# Utiliser une image de base Node.js
FROM node:14
# Définir le répertoire de travail
WORKDIR /app
# Copier les fichiers package.json et package-lock.json
COPY package*.json ./
# Installer les dépendances
RUN npm install
# Copier le code source de l'application
COPY . .
# Exposer le port utilisé par l'application
EXPOSE 3000
# Définir la commande pour démarrer l'application
CMD ["node", "app.js"]
GO TO FULL VERSION