Cet article fait suite à Tests End-to-End avec Docker parties 1 à 3.
Cette 4 ième partie montre comment utiliser Ansible pour orchestrer le démarrage des images Docker.
L’exemple complet est disponible sur github (branche e2e-docker-ansible).
Voir le README pour lancer le test E2E, l’exemple a été testé sous Mac OS avec Docker for Mac .
Explication de ce qui change avec Ansible sur la phase de préparation des tests e2e par rapport à l’approche bash
- Un playbook ansible au format YAML spécifie le lancement des containers mysql et webapp
- Pour exécuter le lancement il suffit d’utiliser la commande ansible-playbook avec le fichier deploy.yml ci-après (voir run complet de toutes les phases)
- name: run mysql and webapp docker containers hosts: 127.0.0.1 connection: local tasks: - name: create log directory file: path={{ log }} state=absent file: path={{ log }} state=directory - name: create properties directory file: path={{ properties_dest }} state=directory - include: download.yml name=application - include: download.yml name=batch - name: run mysql docker: name: mysqldb image: mysql-sample ports: "3306:3306" env: MYSQL_ROOT_PASSWORD: dba state: started - include: wait.yml image=mysqldb - name: run webapp docker: name: webapp image: spring-boot-sample ports: "8080:8080" volumes: - "{{ log }}:/var/log" - "{{ properties_dest }}:/properties" state: started - include: wait.yml image=webapp
- création de la structure nécessaire pour les logs et configurations
- téléchargement des configurations
- description lancement des containers avec module docker
- attente des healthcheck ok des containers
download.yml : détail du téléchargement d’un type de fichier de configuration
- name: download {{ name }} properties get_url: url: "{{ properties_url }}/{{ name }}.properties" dest: "{{ properties_dest }}/{{ name }}.properties" force: yes
wait.yml : détail du traitement d’attente d’un container up & healthy
- name: wait {{ image }} up shell: docker inspect --format={{ '{{' }}.State.Health.Status{{ '}}' }} {{ image }} register: result until: result.stdout == "healthy" retries: 30 delay: 5
Les autres phases ne sont pas remaniées par rapport à la partie 3
Concernant l’usage de docker compose, il est aussi possible de décrire et lancer les containers docker grâce à cet outil mais
- on ne dispose pas de la même souplesse pour insérer les vérifications de healthchek par exemple (feature demandée mais non intégrée à ce jour)
- la partie gestion des configurations des playbook est hors scope
Le pipeline est donc définit comme ceci :
- build image mysql avec ses schémas
- package batch & build image docker
- package restapp & build image docker
- pre e2e deploy
- création structure
- déploiement config
- lancement containers
- pre e2e prepare
- insérer les données initiales via le batch
- e2e tests
- post e2e = stop containers
Pour pratiquer ce pipeline dans un outil d’intégration continue on pourra s’appuyer sur l’usage de la docker registry afin de « pusher » les images docker après chaque phase de build et de « puller » les images en phase pré e2e.