1.10 Dockerfile : modifier le système de base
Objectifs pédagogiques
- Savoir ajouter des fichiers au système
- Savoir ajouter des packages, des utilisateurs, etc.
- Savoir utiliser les commandes ADD, COPY, USER, RUN, WORKDIR
Un dockerfile de test
Éxécuter les commandes suivantes.
$ mkdir ~/test_dockerfile && cd ~/test_dockerfile
$ echo "<h1>Hello</h1>" > ~/test_dockerfile/index.html
$ vim ~/test_dockerfile/Dockerfile
Utilisons un Dockerfile minimal.
# our base image
FROM ubuntu
# run the application
CMD ["sh", "-c", "echo Hello World"]
Instruction WORKDIR
WORKDIR /path/to/workdir
L'instruction WORKDIR définit le répertoire de travail pour toutes les instructions RUN, CMD, ENTRYPOINT, COPY et ADD qui le suivent dans le Dockerfile.
Si le WORKDIR n'existe pas, il sera créé même s'il n'est utilisé dans aucune instruction Dockerfile ultérieure.
L'instruction WORKDIR peut être utilisée plusieurs fois dans un Dockerfile. Si un chemin relatif est fourni, il sera relatif au chemin de l'instruction WORKDIR précédente. Par exemple:
Dockerfile in progress 1/5
# notre image de base
FROM ubuntu
WORKDIR /srv
# La commande par défaut lancée dans le conteneur
CMD ["sh", "-c", "ls /srv"]
Instruction RUN
RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
RUN ["executable", "param1", "param2"] (exec form)
Exécute toutes les commandes dans un nouveau calque au-dessus de l'image actuelle et valide les résultats.
L'image validée résultante sera utilisée pour l'étape suivante dans le Dockerfile.
Dockerfile in progress 2/5
# our base image
FROM ubuntu
WORKDIR /srv
RUN apt update && apt install -y python3
# La commande par défaut lancée dans le conteneur
CMD ["sh", "-c", "ls /srv"]
Instruction COPY
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
Copie les nouveaux fichiers ou répertoires depuis src et les ajoute au système de fichiers du conteneur au chemin dest.
Dockerfile in progress 3/5
# our base image
FROM ubuntu
WORKDIR /srv
RUN apt update && apt install -y python3
# Cette commande copie index.html depuis le contexte de build dans /srv dans le conteneur
# index.html doit exister dans votre dossier de projet
COPY index.html /srv
# La commande par défaut lancée dans le conteneur
CMD ["sh", "-c", "ls /srv"]
Après avoir ajouté ces instructions, lors du build, que remarque-t-on ?
La construction reprend depuis la dernière étape modifiée. Sinon, la construction utilise les layers précédents, qui avaient été mis en cache par le Docker Engine.
Instruction ADD
ADD [--chown=<user>:<group>] [--checksum=<checksum>] <src>... <dest>
Copie les nouveaux fichiers, répertoires ou URL de fichiers distants depuis src et les ajoute au système de fichiers de l'image au chemin dest.
Généralement utilisé pour ajouter le code du logiciel en cours de développement et sa configuration au conteneur.
Dockerfile in progress 4/5
# our base image
FROM ubuntu
WORKDIR /srv
RUN apt update && apt install -y python3
COPY index.html /srv
ADD https://www.gnu.org/licenses/gpl-3.0.txt /srv/licence.txt
# La commande par défaut lancée dans le conteneur
CMD ["sh", "-c", "ls /srv"]
Instruction USER
USER <user>[:<group>]
USER <UID>[:<GID>]
L'instruction USER définit le nom d'utilisateur (ou UID) et éventuellement le groupe d'utilisateurs (ou GID) à utiliser comme utilisateur et groupe par défaut pour le reste de l'étape en cours.
L'utilisateur spécifié est utilisé pour les instructions RUN et, lors de l'exécution, exécute les commandes ENTRYPOINT et CMD appropriées.
Dockerfile in progress 5/5
# our base image
FROM ubuntu
WORKDIR /srv
RUN apt update && apt install -y python3
# Cette commande copie index.html depuis le contexte de build dans /srv dans le conteneur
# index.html doit exister dans votre dossier de projet
COPY index.html /srv
ADD https://www.gnu.org/licenses/gpl-3.0.txt /srv/licence.txt
# creation de l'utilisateur car USER ne le cree pas pour nous
RUN useradd -d /srv -ms /bin/bash app
# changement d'utilisateur pour la suite des instructions Dockerfile (en particulier la CMD)
USER app
# Mettons à jour la commande pour servir notre page index.html avec python httpserver
CMD ["python3", "-m", "http.server", "8000"]
Avancé : Utilisation optimale du cache de build
La documentation officielle est super claire à ce sujet: