docker

Utilisation de docker

Docker Compose

Le fichier docker-compose.yml définit:

  • Les images docker à construire et à exécuter (directive build)
  • Les liens réseau adressés entre nos containers (directive links)
  • Les redirections de ports sur l'hôte d'exécution (directive ports)
  • Les volumes qui seront montés sur nos containers respectifs (directive volumes)
version: '3.1'

services:
  ldap:
    build: ./ldap
    networks:
      back:
        ipv4_address: 172.20.0.253
    volumes:
      - "./ldap/db:/db"
    ports:
      - "389:389"
  postgresql:
    build: ./postgresql
    networks:
      back:
        ipv4_address: 172.20.0.252
    volumes:
      - "./postgresql/db/data.sql:/docker-entrypoint-initdb.d/data.sql"
    ports:
      - "5432:5432"
  #elastic:
  #  build: ./elastic
  #  environment:
  #    - http.host=0.0.0.0
  #    - xpack.security.enabled=false
  #  networks:
  #    intra:
  #      ipv4_address: 172.20.0.3     
  colectica:
    build: ./colectica
    networks:
      back:
        ipv4_address: 172.20.0.251
    volumes:
      - ./colectica/app/db.json:/usr/src/app/db.json
      - ./colectica/app/routes.json:/usr/src/app/routes.json
      - ./colectica/app/middleware.js:/usr/src/app/middleware.js
    ports:
      - "3000:3000"
  ddi-access-services:
    build: ./ddi-access-services
    volumes:
      - "./ddi-access-services/ddi-access-services.war:/usr/local/tomcat/webapps/ddi-access-services.war"
      - "./ddi-access-services/ddi-access-services.properties:/usr/local/tomcat/webapps/ddi-access-services.properties"
    networks:
      - back
  stromae:
    build: ./stromae
    volumes:
      - "./stromae/rmesstromae.war:/usr/local/tomcat/webapps/rmesstromae.war"
      - "./stromae/config/:/usr/local/tomcat/webapps/config/"
    networks:
      back:
        ipv4_address: 172.20.0.250
    ports:
      - "8181:8080"
  pogues-bo:
    build: ./pogues-bo
    environment:
      - fr.insee.pogues.env=qa
    volumes:
      - "./pogues-bo/rmspogfo.war:/usr/local/tomcat/webapps/rmspogfo.war"
      - "./pogues-bo/rmspogfo.properties:/usr/local/tomcat/webapps/rmspogfo.properties"
    networks:
      - back
    ports:
      - "8080:8080"
  exist:
    build: ./eXist
    networks:
      back:
        ipv4_address: 172.20.0.249
    ports:
      - "9080:8080"
  exist-seed:
    build:
      context: ./eXist-seed
      args:
        - HTTP_PROXY=$HTTP_PROXY
    depends_on:
      - exist
    volumes:
      - ./eXist-seed/app:/opt/exist/app
      - ./eXist-seed/db:/opt/exist/db
      - ./eXist-seed/system:/opt/exist/system
    networks:
      back:
  json-db-seed:
    build:
      context: ./json-db-seed
      args:
        - HTTP_PROXY=$HTTP_PROXY
    depends_on:
      - pogues-bo
    volumes:
      - ./json-db-seed/app:/opt/json-db-seed/app
      - ./json-db-seed/json:/opt/json-db-seed/json

    networks:
      back:
networks:
  back:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.20.0.0/16

Pour l'exécution des tests avec travis la commande utilisée est:

docker-compose up

L'exécution de cette commande démarre les trois containers et relie le container tomcat aux containers ldap et postgresql.

NB: Pour indiquer au serveur tomcat qu'il doit utiliser les containers comme backend on peut éditer la variable d'environement CATALINA_OPT dans le fichier docker-compose.yml

  tomcat:
    build: ./tomcat
    environment:
      - fr.insee.pogues.env=qa
    volumes:
      - "./tomcat/rmspogfo.war:/usr/local/tomcat/webapps/rmspogfo.war"
      - "./tomcat/pogues-bo.properties:/usr/local/tomcat/webapps/rmspogfo.properties"
    networks:
      - intra
    ports:
      - "8080:8080"

Si un fichier rmspogfo.properties est présent dans le répertoire tomcat, les propriétés définies dans ce fichier surchargeront les propriétés définies dans le répertoire d'environnement qa

Utilisation en mode développement

En mode développement, utiliser docker-compose pour démarrer uniquement les backends nécessaires à tomcat et laisser votre IDE gérer la compilation et le déploiement de votre application.

  • Démarrer uniquement les backends nécessaires à tomcat:
docker-compose up postgresql ldap elasticsearch colectica
  • Indiquer à tomcat qu'il doit utiliser ces containers comme backends:

Sur Eclipse ou IntelliJ il suffit d'éditer la configuration de lancement pour passer la variable d'environnement appropriée à tomcat

-Dfr.insee.pogues.env=dev

Utilisation en mode déploiement

  • Récupérer la dernière version stable de l'application

  • Déposer le war téléchargé dans le répertoire docker/tomcat

NB: Alternativement on peut packager la version locale en utilisant le script prévu à cet effet

bash scripts/build.sh rmspogfo
  • Lancer l'ensemble des containers
docker-compose up

Configurer le container colectica

Le container colectica s'appuie sur le module json-server

Ce module exploite un fichier json pour exposer des resources via une API REST

L'API Colectica contourne un certain nombre de principes des architectures REST et il faut donc configurer json-server pour rendre son comportement similaire à celui de l'API Colectica

Réécriture d'URL

Pour prendre l'exemple de la resources /items, cette resource est définie par json-server à partir de la clef items définie dans le fichier db.json et de la collection associée.

Pour faire correspondre cette url de resource à l'URL appelée en production on éditera le fichier routes.json de la manière suivante:

{
  "/api/v1/item/fr.insee/:id?api_key=ADMINKEY": "/items/:id",
  "/api/v1/set/fr.insee/:id?api_key=ADMINKEY": "/set",
  "/api/v1/item/_getList?api_key=ADMINKEY": "/items"
}

De la même manière, l'API Colectica expose un certain nombre de routes renvoyant des resources à l'invocation d'appels utilisant le verbe POST

Ce type de comportement n'étant pas strictement conforme aux architectures REST, on a besoin d'ajouter les middleware nécessaires au code exécuté par notre serveur en éditant le fichier app/middleware.js:

module.exports = (server, router) => {

    server.post('/items', (req, res) => {
        const db = router.db    
        const items = router.db.get('items').value()
        res.jsonp(items)
    })

    server.get('/items/:id', (req, res) => {
        const db = router.db
        const item = router.db.get('items').find({ 'Identifier': req.params.id }).value()
        res.jsonp(item)
    })
}

results matching ""

    No results matching ""