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 !