Fonctionnement du Dockerfile

Présentation

Le Dockerfile définit comment votre environnement va fonctionner à l’intérieur du conteneur.

L’accès aux ressources comme les interfaces réseaux, les espaces disque sont virtualisées à l’intérieur de l’environnement, ce qui les isolent du reste du système.

Il est nécessaire de faire le mapping des ports pour y avoir accès depuis l’extérieur, de spécifier les fichiers qui seront copiés dans le conteneur, etc…

Après avoir fait cela, on peut supposer que notre application fonctionnera de la même manière, peut importe le système qui exécutera le conteneur.

Usage

$ docker build -f /path/to/a/Dockerfile .

Le « . » spécifie l’emplacement des répertoires/fichiers qui seront défini comme « contexte » pour le Dockerfile.

Il est possible de tester la syntaxe du Dockerfile

docker build -t test/myapp .
Sending build context to Docker daemon 2.048 kB
Error response from daemon: Unknown instruction: RUNCMD

Les instructions du Dockerfile suivent la syntaxe suivante :

# Comment
INSTRUCTION arguments

Instructions

FROM : Spécifie l’image de base avec laquelle le conteneur sera construit

FROM <image>[:<tag>] [AS <name>]

ARG : Définit les variables qui peuvent être passer par l’utilisateur au démarrage du conteneur

ARG  CODE_VERSION=latest
FROM base:${CODE_VERSION}

ENV : Permet de déclarer une variable d’environnement

RUN : Permet l’exécution d’une commande ou d’un script

CMD : Tout comme RUN, elle permet l’exécution d’une commande ou d’un script mais elle ne peut être déclaré qu’une seul fois dans un Dockerfile

LABEL : Ajoute des méta-données à une image

LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."

EXPOSE : Permet de spécifier à Docker les ports réseaux nécessaires à ouvrir au démarrage du conteneur

ADD : Copie des nouveaux fichiers, dossiers depuis la source spécifiée vers le système de fichier de l’image au chemin indiqué.

ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]

ADD permet également de récupérer des éléments depuis une URL ou de décompresser une archive.

COPY : Plus strict que ADD, cette instruction est préférée à celle-ci.

ENTRYPOINT : Similaire à l’instruction CMD mais ne peut pas être surchargé au démarrage du conteneur.

VOLUME : Créer un point de montage dans le conteneur

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

USER : Définit l’utilisateur qui sera utilisé pour les instructions RUN, CMD et ENTRYPOINT

    FROM microsoft/windowsservercore
    # Create Windows user in the container
    RUN net user /add patrick
    # Set it for subsequent commands
    USER patrick

WORKDIR : Définit le répertoire de travail pour les instructions RUN, CMD, ENTRYPOINT, COPY et ADD

ONBUILD : Ajoute à l’image un déclencheur qui sera exécuter lorsque l’image sera utilisée comme base de construction d’une autre image.

HEALTHCHECK : Permet de définit une commande qui vérifiera l’état de santé du conteneur lorsqu’il sera en exécution

HEALTHCHECK --interval=5m --timeout=3s \
  CMD curl -f http://localhost/ || exit 1

SHELL : Modifie le shell par défaut

Mémo des commandes Docker

## Liste les commandes CLI de Docker
docker
docker container --help

## Affiche la version de Docker et ses infos
docker --version
docker version
docker info

## Exécute une image Docker
docker run hello-world

## Liste des images
docker image ls

## Liste les conteneurs Docker (running, all, all in quiet mode)
docker container ls
docker container ls --all
docker container ls -aq

## Affiche les méta-données d'une image
docker inspect
docker build -t friendlyhello .  # Create image using this directory's Dockerfile
docker run -p 4000:80 friendlyhello  # Run "friendlyname" mapping port 4000 to 80
docker run -d -p 4000:80 friendlyhello         # Same thing, but in detached mode
docker container ls                                # List all running containers
docker container ls -a             # List all containers, even those not running
docker container stop <hash>           # Gracefully stop the specified container
docker container kill <hash>         # Force shutdown of the specified container
docker container rm <hash>        # Remove specified container from this machine
docker container rm $(docker container ls -a -q)         # Remove all containers
docker image ls -a                             # List all images on this machine
docker image rm <image id>            # Remove specified image from this machine
docker image rm $(docker image ls -a -q)   # Remove all images from this machine
docker login             # Log in this CLI session using your Docker credentials
docker tag <image> username/repository:tag  # Tag <image> for upload to registry
docker push username/repository:tag            # Upload tagged image to registry
docker run username/repository:tag                   # Run image from a registry