Recommandations générales

On utilisera une version récente dans les fichiers docker-compose.yml, et au minimum la 3.7 pour profiter des fonctionnalités présentées dans toute la section.

snippet.yaml
version: '3.7'

Lorsque l’image référencée par le fichier Compose via la directive image n’est pas présente sur un registry officiel, il est très utile de préciser à Compose comment la construire et à partir de quoi.

Question:

Quel intérêt par rapport à un docker build manuel ?

La commande docker-compose build construira automatiquement toutes les images du fichier Compose qui doivent l’être, en allant chercher les fichiers au bon endroit, et les taggera automatiquement en fonction de la directive image. C’est très pratique et ça évite les erreurs manuelles.

Note:

On utilise la directive build pour dire à Compose comment construire l’image. Cette directive est au niveau d’un service, par exemple :

snippet.yaml
services:
  example:
    image: <image>
    build: <context>

Le Dockerfile se trouve dans le même dossier que le fichier Compose. On indiquera :

snippet.yaml
build: .

Ce qui indique à Compose d’utiliser le dossier actuel comme contexte de build, et de chercher le Dockerfile dedans.

On précisera le nom du Dockerfile :

snippet.yaml
build:
  context: .
  dockerfile: <nom du Dockerfile>

On changera le contexte de construction :

snippet.yaml
build: <dossier où se trouve le Dockerfile>

Note:

Dans certains cas, un dépôt Git existe avec le Dockerfile ainsi que tous les fichiers nécessaires pour construire l’image (code…), mais l’image construite n’est pas disponible sur un dépôt officiel (exemple : delete pads after delay).

Si le Dockerfile nous convient, il serait pénible de le copier sur notre dépôt et de le synchroniser à la main au fil des évolutions. Heureusement, Compose sait construire une image depuis un dépôt distant. Comme il est préférable de récupérer une version précise, par exemple via un tag Git, on pourra utiliser la syntaxe suivante pour construire l’image depuis le dépôt accessible à l’URL https://repo.git, avec le tag tag.

snippet.yaml
build: https://repo.git#tag

Lien:

La syntaxe complète pour le contexte Git est disponible sur la documentation officielle.

On préférera utiliser la politique restart: unless-stopped pour les services. Ceci évite qu’un service arrêté explicitement ne se relance tout seul au démarrage de la machine.

Les HEALTHCHECK définis dans les Dockerfile ont souvent un intervalle assez long, ce qui empêche les conteneurs d’être pris en compte rapidement par Traefik (car un conteneur qui n’est pas noté healthy est exclu de la configuration Traefik).

Il est donc intéressant de les définir directement dans le fichier Compose pour plus de souplesse, voire d’écraser le HEALTHCHECK existant.

  • technique/docker/good_practices/misc.txt
  • de qduchemi