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)
})
}