Ecrire un Dockerfile

Dans cet article nous allons voir comment écrire un Dockerfile. Pour cela nous allons utiliser plusieurs instructions documentées ici: https://docs.docker.com/engine/reference/builder/#entrypoint.

Ici nous allons créer une image qui ne fera qu'exécuter le script python3 suivant:

#!/usr/bin/python3

print("Hello there")

Pour commencer nous allons créer un répertoire sur notre système hôte dans lequel nous allons stocker notre script python. Pour ma part j'ai créé le répertoire /tmp/mydocker.

Ensuite nous allons écrire notre Dockerfile. Un Dockerfile doit toujours commencer par l'instruction FROM. Cette instruction informe le daemon docker à partir de quelle image il doit se baser pour créer notre image. Imaginons que nous voulons monter un service Nginx. Pour cela nous aurons besoin d'un ensemble d'outils disponibles au sein des systèmes d'exploitation Linux. Dans ce cas là notre Dockerfile pourra commencer par l'instruction suivante:

FROM ubuntu:latest

Ici nous ne ferons qu'exécuter un script python3 donc nous n'aurons besoin que de l'interpréteur python3. Une bonne pratique serait de partir sur une base telle que l'image python:latest:

FROM python:latest

Ensuite nous allons créer un nouvel utilisateur (il serait inutile et surtout dangereux de faire tourner un container en tant que root):

RUN useradd -ms /bin/bash defte

Les options -m et -s permettent respectivement de créer un home pour l'utilisateur et de spécifier son shell par défaut.

Une fois l'utilisateur créé nous allons modifier le répertoire courant pour que celui-ci pointe sur le home de l'utilisateur defte:

WORKDIR /home/defte

Puis nous allons copier le fichier myscript.py depuis le système de fichiers de mon système hôte vers le container. Pour cela nous disposons de deux instructions:

  • ADD va nous permettre de copier des fichiers mais aussi des URL's ou encore d'extraire une archive tar à la volée directement dans le système de fichier du container
  • COPY va juste nous permettre de copier un ou plusieurs fichiers

Ces deux instructions supportent toutes les deux les caractères spéciaux "?" ou "*" ce qui nous permet de déplacer des répertoires entiers assez facilement. Ici nous ne copierons qu'un seul fichier:

COPY myscript.py .

Il ne faudra pas oublier d'attribuer à notre utilisateur les droits d'exécution sur ce script:

RUN chown defte: /home/defte/myscript.py
RUN chmod u+x /home/defte/myscript.py

Enfin Il ne nous restera plus qu'à modifier l'utilisateur courant:

USER defte

Puis utiliser l'instruction ENTRYPOINT de manière à indiquer que l'on veut que le script myscript.py soit exécuté une fois le container démarré:

ENTRYPOINT /home/defte/myscript.py

Pour obtenir notre Dockerfile final:

FROM python:latest
RUN useradd -ms /bin/sh defte
WORKDIR /home/defte
COPY myscript.py .
RUN chown defte: /home/defte/myscript.py
RUN chmod u+x /home/defte/myscript.py
USER defte
ENTRYPOINT /home/defte/myscript.py

On build notre image docker:

sudo docker build . -t mydocker:1.0

Puis on la lance:

sudo docker run mydocker:1.0

Et on obtient bien le retour du script python:

Voilà, notre première image est fonctionnelle!