18/12/2022

2. Cycle de vie d'une stack

Lu 352 fois Licence Creative Commons

Démarrage et arrêt

Le démarrage d'une stack se fait par la commande up. Comme pour docker run, une option -d (pour --detach) permet de démarrer les services en arrière-plan:

docker compose up -d

Cette simple commande va s'occuper de créer les réseaux et les volumes si nécessaire, et démarrer les conteneurs des services en téléchargeant ou construisant les images si nécessaire.

Pour arrêter la stack, on utilisera la commande down:

docker compose down

Options de stack

Nom de projet

Le nom des objets d'une stack sont préfixés par le nom du projet qui correspond par défaut au nom du répertoire courant. Mais on peut indiquer le nom en ajoutant l'option -p (ou --project-name) à la commande Compose:

docker compose -p mon-projet up -d

Variables d'environnement

Il est possible d'utiliser des variables dans le fichier docker-compose.yml et de fournir un fichier de variables d'environnement.

Fichier de variables dev.env:

APP_TAG=local

Fichier docker-compose.yml:

version: "3.8"

services:
    app:
	    image: "mon-app:${APP_TAG}"

Démarrage de la stack avec l'option --env-file:

docker compose --env-file ./dev.env up -d

Fichiers de surcharge

La configuration d'une stack peut comporter des différences entre 2 environnements:

  • besoin d'un bind mount lors du développement
  • ajout d'un service pour le développement qui correspond à un service externe en production
  • variables d'environnement différentes
  • ...

Plutôt que de maintenir plusieurs fichiers décrivant la même stack, on peut utiliser des fichiers de surcharge avec l'option -f (ou --file).

Partant d'un fichier docker-compose.yml correspondant à l'environnement de production:

version: "3.8"

networks:
    app-net:
        driver: overlay

services:
    app:
        image: mon-app:v1.2.3
        networks:
            - app-net
        environment:
            APP_ENV: prod

On peut y ajouter un fichier docker-compose.dev.yml pour le développement:

version: "3.8"

# Changement du driver du reseau principal
networks:
    app-net:
        driver: bridge

# Changement du tag de l'image et d'une variable d'environnement et ajout d'un bind mount
services:
    app:
        image: mon-app:latest
        volumes:
            - ./app:/srv/app
        environment:
            APP_ENV: dev

    # Ajout d'un service pour les emails
    maildev:
        image: maildev/maildev:1.1.0
        # ...

On démarre enfin la stack de développement en indiquant les 2 fichiers:

docker compose -f ./docker-compose.yml -f ./docker-compose.dev.yml up -d

Astuce: Pour le debug lors de l'utilisation de multiples fichiers, utiliser la commande config qui affichera le YAML complet de la spécification utilisée par Docker Compose:

docker compose -f ./docker-compose.yml -f ./docker-compose.dev.yml config