Je suis en train de retravailler un pipeline pour utiliser l'approche des pipelines déclaratifs afin de pouvoir tiliser des images Docker à chaque étape.
Pour le moment, j'ai le code de travail qui effectue des tests d'intégration en se connectant à une base de données exécutée dans un conteneur Docker.
node {
// checkout, build, test stages...
stage('Integration Tests') {
docker.image('mongo:3.4').withRun(' -p 27017:27017') { c ->
sh "./gradlew integrationTest"
}
}
Maintenant, avec Declarative Pipelines, le même code ressemblerait à ceci:
pipeline {
agent none
stages {
// checkout, build, test stages...
stage('Integration Test') {
agent { docker { image 'openjdk:11.0.4-jdk-stretch' } }
steps {
script {
docker.image('mongo:3.4').withRun(' -p 27017:27017') { c ->
sh "./gradlew integrationTest"
}
}
}
}
}
}
Problème: L'étape est maintenant exécutée à l'intérieur d'un conteneur Docker et l'exécution de docker.image()
conduit à une erreur docker: not found
Dans l'étape (il recherche docker dans l'image openjdk
qui est maintenant utilisée).
Question: Comment démarrer un conteneur DB et s'y connecter à partir d'une étape dans les pipelines déclaratifs?
J'ai eu un problème similaire, où je voulais pouvoir utiliser une image Maven Docker standard pour exécuter mes builds tout en étant capable de construire une image Docker contenant l'application. J'ai accompli cela en démarrant d'abord le conteneur Maven dans lequel la génération doit être exécutée en lui donnant accès au point de terminaison Docker des hôtes.
Exemple partiel:
docker run -v /var/run/docker.sock:/var/run/docker.sock maven:3.6.1-jdk-11
Ensuite, à l'intérieur du build-container, je télécharge les binaires Docker et définit l'hôte Docker:
export DOCKER_Host=unix:///var/run/docker.sock
wget -nv https://download.docker.com/linux/static/stable/x86_64/docker-19.03.2.tgz
tar -xvzf docker-*.tgz
cp docker/docker /usr/local/bin
Maintenant, je peux exécuter la commande docker dans mon build-container. Pour moi, un effet secondaire, toute image Docker créée à l'intérieur d'un conteneur à une étape de la génération sera disponible pour les étapes suivantes de la génération, également dans des conteneurs, car elles seront conservées dans l'hôte.