Gitlab

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.

Top