docker-compose.yml
Le Docker-compose permet de décrire l’ensemble des services formant une application.
Cette description sera utilisée à différentes étapes du projet, principalement pour le développement et sur le serveur d’intégration continue (tests de l’application, préparation des assets …) et éventuellement en production.
Les variables d’environnement
Pour reproduire le comportement de la CI de Gitlab, le Docker-compose pourra utiliser des variables d’environnement : elles peuvent faire appel à aux variables définies dans Gitlab ou dans un fichier .env
En local, ce fichier sera utilisé pour stocker les accès aux services dont l’application a besoin pour fonctionner (serveur de base de données, serveur d’envoi d’email …). Une fois déployés, les projets auront un .env généré par le service de déploiement pour chaque environnement (préprod/prod/…).
Docker-compose
L’image construite grâce au Dockerfile pourra être utilisée dans le fichier docker-compose.yml afin de définir le service de notre application.
services:
# our webapp.
app:
# use our image
image: ${CI_REGISTRY_IMAGE}/app:${CI_COMMIT_SHA}
# expose our server port
expose: [9000]
# define some env vars available to our container
environment:
ENV: ${CI_ENVIRONMENT_NAME}
A noter que la variable CI_ENVIRONMENT_NAME
fait référence à l’environment:name défini dans le fichier .gitlab-ci.yml
Ajout d’un service de base de données
Si notre application a besoin de se connecter à une base de données, il faut lui ajouter les directives qui conviennent pour qu’elle se connecte au serveur de bdd.
Dans le fichier .env, on ajoute les valeurs d’accès au serveur de BDD:
MYSQL_DATABASE=myapp_python
MYSQL_USER=myapp_python
MYSQL_PASSWORD=password
Dans le Docker-compose, on ajoute un nouveau service:
# mysql database service
mysql:
image: mariadb:10.1
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- mysql_db_data:/var/lib/mysql
qu’on vient lier à notre service “app” de cette manière:
# our webapp.
app:
[...]
# link this container to the mysql service
depends_on:
- mysql
# define some env vars available to our container
environment:
ENV: ${CI_ENVIRONMENT_NAME}
CI_ENVIRONMENT_DOMAIN: ${CI_ENVIRONMENT_DOMAIN}
# mysql database connection
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
Ajouter un volume
Si notre application a besoin d’un volume pour stocker des valeurs persistantes, on ajoute la directive suivante dans la description du service:
# our webapp.
app:
[...]
# define a volume where we can write uploads
volumes:
- ./data/uploads:/var/www/uploads
Au final, le docker-compose ressemblera à ce qui suit:
services:
# our webapp.
app:
# use our image
image: ${CI_REGISTRY_IMAGE}/app:${CI_COMMIT_SHA}
# expose our server port
expose: [9000]
# link this container to the mysql service
depends_on:
- mysql
# define a volume where we can write uploads
volumes:
- ./data/uploads:/var/www/uploads
# define some env vars available to our container
environment:
ENV: ${CI_ENVIRONMENT_NAME}
CI_ENVIRONMENT_DOMAIN: ${CI_ENVIRONMENT_DOMAIN}
# mysql database connection
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
# mysql database service
mysql:
image: mariadb:10.1
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- mysql_db_data:/var/lib/mysql
Maintenant que les services sont correctement définis, il nous faut construire l’image Docker de l’application, et la tester.