11. Construire une image avec Docker Compose - Docker

Nous avons vu dans le cours précédent comment lancer un simple conteneur à partir de l'image nginx avec quelques options supplémentaires. Mais dans notre cas, nous avons précédemment construit une image Python afin d'y inclure nos dépendances. Regardons comment intégrer le build d'une image avec Docker Compose.

Contexte

Nous allons partir d'une commande docker run contenant le plus d'arguments et d'options comme ceci (le port 8000 du conteneur correspondrait par exemple au module http-server de Python) :

docker run -td --name mon-conteneur-python \
	   		   -p 80:8000 \
	   		   -v mon-script:/opt/scripts \
	    	    mon-image-python:1.0.0

En prenant également en compte que l'image mon-image-python est basée sur ce Dockerfile :

FROM python

ARG requests_version

RUN pip install requests==${requests_version} && \
    useradd -d /home/python-user -m -s /bin/bash python-user

USER python-user

WORKDIR /home/python-user    

COPY main.py /home/python-user    

CMD ["main.py"]

ENTRYPOINT ["python3"]

Et construite avec la commande docker build suivante :

docker build --build-arg requests_version=2.28.2 -t mon-image-python:1.0.0 .

Conversion vers Docker Compose

Nous allons maintenant convertir le build de l'image Docker ainsi que le lancement du conteneur en un seul fichier docker-compose.yml. Le nom du fichier est important, car Docker Compose s'attends à avoir un un fichier portant ce nom.

Déclarons ces lignes :

---
version: '3.3'
services:
  python:
    build:
      context: .
      args:
        requests_version: 2.28.2
    image: mon-image-python:1.0.0
    ports:
      - 80:8000
    volumes:
        - mon-script:/opt/scripts

volumes:
  mon-script:

La clé build définit l'image qui va être construite et utilisée dans le conteneur Python.
Nous avons précisé l'arguement de build requests_version comme dans notre commande docker build.

La création du volume managé par Docker a été déclarée comme ceci :

volumes:
    - mon-script:/opt/scripts

Avec plus bas :

volumes:
  mon-script:

Cette syntaxe est nécessaire afin d'ordonner à Docker Compose de d'abord créer le volume, puis de le monter dans ce conteneur. Il va effectuer l'équivalent de la commande docker volume create.

Si on avait voulu créer un volume non managé, d'un simple répertoire sur notre machine hôte, on aurait utilisé la syntaxe ci-dessous :
volumes:
    - /mon-repertoire-source:/mon-repertoire-cible

Maintenant que nous avons détaillé notre Docker Compose, il suffit d'exécuter la commande suivante pour que le build de l'image s'exécute ainsi que le lancement du conteneur :

docker-compose up -d

Vous réalisez la différence entre le mode impératif de Docker et le mode déclaratif ?
En effet, dans le cas impératif, il aurait fallu lancer une commande docker run très longue, puis une commande docker build.

Alors qu'avec Docker Compose, tout est déclaré dans notre fichier docker-compose.yml, cela nous évite aussi de lancer plusieurs commandes.

Dans cet exemple, nous avons lancé seulement un seul conteneur avec Docker Compose. Dans le cours suivant, nous allons déployer un docker-compose.yml multi-conteneurs !