Créer une nouvelle image à partir de plusieurs images sources
Dans cette étape, nous allons apprendre à créer une nouvelle image Docker en combinant le contenu de plusieurs images sources. Ceci est un scénario courant lorsque vous avez besoin de construire une image incluant des composants provenant de différentes images de base ou images pré-construites.
Tout d'abord, récupérons les images sources nécessaires. Nous utiliserons les images ubuntu
et alpine
comme exemples.
docker pull ubuntu:latest
docker pull alpine:latest
Vous devriez voir une sortie indiquant que les images sont en cours de téléchargement.
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
Maintenant, nous allons créer une nouvelle image en utilisant un Dockerfile
. Un Dockerfile
est un document texte contenant toutes les commandes qu'un utilisateur pourrait appeler en ligne de commande pour assembler une image. Créez un nouveau fichier nommé Dockerfile
dans votre répertoire ~/project
.
nano ~/project/Dockerfile
Ajoutez le contenu suivant au Dockerfile
:
FROM ubuntu:latest AS base
FROM alpine:latest AS alpine_base
COPY --from=alpine_base /etc/alpine-release /app/alpine-release
COPY --from=base /etc/os-release /app/ubuntu-release
WORKDIR /app
CMD ["ls", "-l"]
Décomposons ce Dockerfile
:
FROM ubuntu:latest AS base
: Cette ligne définit l'image de base pour la première étape de notre construction comme étant ubuntu:latest
et nomme cette étape base
.
FROM alpine:latest AS alpine_base
: Cette ligne démarre une nouvelle étape de construction en utilisant alpine:latest
comme image de base et nomme cette étape alpine_base
. Il s'agit d'une construction multi-étapes (multi-stage build), nous permettant de copier des fichiers entre les étapes.
COPY --from=alpine_base /etc/alpine-release /app/alpine-release
: Cette commande copie le fichier /etc/alpine-release
depuis l'étape alpine_base
vers le répertoire /app/alpine-release
dans l'étape courante.
COPY --from=base /etc/os-release /app/ubuntu-release
: Cette commande copie le fichier /etc/os-release
depuis l'étape base
vers le répertoire /app/ubuntu-release
dans l'étape courante.
WORKDIR /app
: Définit le répertoire de travail pour les instructions suivantes comme étant /app
.
CMD ["ls", "-l"]
: Spécifie la commande par défaut à exécuter lorsqu'un conteneur est démarré depuis cette image. Elle listera le contenu du répertoire /app
.
Enregistrez le Dockerfile
en appuyant sur Ctrl + X
, puis Y
, et Entrée
.
Maintenant, construisons l'image en utilisant la commande docker build
. Le .
à la fin de la commande spécifie le contexte de construction, qui est le répertoire courant (~/project
).
docker build -t my-multi-stage-image:latest ~/project
Vous devriez voir une sortie indiquant le processus de construction, incluant les différentes étapes exécutées.
[+] Building
...
Successfully built <image_id>
Successfully tagged my-multi-stage-image:latest
Une fois la construction terminée, vous pouvez vérifier que l'image a bien été créée en listant vos images locales.
docker images my-multi-stage-image
Vous devriez voir votre nouvelle image dans la liste.
REPOSITORY TAG IMAGE ID CREATED SIZE
my-multi-stage-image latest <image_id> About a minute ago ...MB
Enfin, lançons un conteneur depuis cette image pour voir les fichiers copiés.
docker run --rm my-multi-stage-image:latest
Le drapeau --rm
supprime automatiquement le conteneur lorsqu'il se termine. La sortie devrait montrer les fichiers copiés depuis les images ubuntu
et alpine
.
total 8
-rw-r--r-- 1 root root 25 Aug 24 10:00 alpine-release
-rw-r--r-- 1 root root 281 Aug 24 10:00 ubuntu-release
Ceci confirme que nous avons réussi à créer une image en combinant du contenu provenant de plusieurs images sources en utilisant une construction multi-étapes.