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.

Publicité