À l'heure actuelle, nos agents Jenkins génèrent un docker-compose.yml pour chacun de nos projets Rails, puis exécutent docker-compose up. Le docker-compose.yml a un conteneur "web" principal qui contient rbenv et toutes nos autres dépendances Rails. Il est lié à un conteneur DB contenant le test Postgres DB.
Le problème survient lorsque nous devons exécuter les tests et générer des codes de sortie. Notre serveur CI ne se déploiera que si le script de test renvoie la sortie 0, mais docker-compose renvoie toujours 0, même si l'une des commandes du conteneur échoue.
L'autre problème est que le conteneur de base de données s'exécute indéfiniment, même une fois que le conteneur Web a terminé d'exécuter les tests, il docker-compose up
ne revient donc jamais.
Existe-t-il un moyen d'utiliser docker-compose pour ce processus? Nous aurions besoin de pouvoir exécuter les conteneurs, mais de quitter une fois le conteneur Web terminé et de renvoyer son code de sortie. Pour le moment, nous sommes bloqués manuellement à l'aide de docker pour faire tourner le conteneur DB et exécuter le conteneur Web avec l'option --link.
la source
docker-compose
1.12.0 et supérieure. C'est peut-être votre cas aussi. Un exemple pourrait être:docker-compose up --exit-code-from test-unit
. Notez que cela n'a pas fonctionné pour moi jusqu'à ce que j'aie ajouté unset -e
au début de mon script.--exit-code-from
ne fonctionne pas avec-d
cependant. Il lancera ces erreurs:using --exit-code-from implies --abort-on-container-exit
et--abort-on-container-exit and -d cannot be combined.
docker-compose run
est le moyen simple d'obtenir les statuts de sortie que vous désirez. Par exemple:Sinon, vous avez la possibilité d' inspecter les conteneurs morts. Vous pouvez utiliser l'
-f
indicateur pour obtenir uniquement l'état de sortie.En ce qui concerne le conteneur db qui ne retourne jamais, si vous l'utilisez,
docker-compose up
vous devrez sigkill ce conteneur; ce n'est probablement pas ce que vous voulez. Au lieu de cela, vous pouvez utiliserdocker-compose up -d
pour exécuter vos conteneurs démonisés et supprimer manuellement les conteneurs lorsque votre test est terminé.docker-compose run
devrait exécuter des conteneurs liés pour vous, mais j'ai entendu des discussions sur SO à propos d'un bogue empêchant cela de fonctionner comme prévu pour le moment.la source
docker-compose logs
-T
S'appuyant sur la réponse de Kojiro:
docker-compose ps -q | xargs docker inspect -f '{{ .State.ExitCode }}' | grep -v '^0' | wc -l | tr -d ' '
Renvoie le nombre de codes de sortie non-0 renvoyés. Serait 0 si tout sortait avec le code 0.
la source
docker-compose ps
, par exemple:docker-compose ps | grep -c "Exit 1"
vous donnera le décompte à partir duquel "Sortie 1" correspond à l'affichagedocker-compose ps
(qui fournit un joli tableau récapitulatif des résultats). Les codes de sortie sont répertoriés dans la colonne "État".Si vous êtes prêt à utiliser
docker-compose run
pour lancer manuellement vos tests, l'ajout de l'--rm
indicateur, assez curieusement, fait que Compose reflète avec précision l'état de sortie de votre commande.Voici mon exemple:
la source
(docker-compose run --rm ...) || exit $?
pour résiliation en cas d'erreur. Utile dans les scripts bash.Utilisez
docker wait
pour obtenir le code de sortie:foo
est le "nom du projet". Dans l'exemple ci-dessus, je l'ai spécifié explicitement, mais si vous ne le fournissez pas, c'est le nom du répertoire.bar
est le nom que vous donnez au système testé dans votre docker-compose.yml.Notez que cela
docker logs -f
fait aussi la bonne chose, en sortant lorsque le conteneur s'arrête. Ainsi vous pouvez mettreentre le
docker-compose up
et ledocker wait
pour que vous puissiez regarder vos tests s'exécuter.la source
--exit-code-from SERVICE
et--abort-on-container-exit
ne fonctionnent pas dans les scénarios où vous devez exécuter tous les conteneurs jusqu'à la fin, mais échouent si l'un d'entre eux est sorti prématurément. Un exemple pourrait être si l'exécution de 2 combinaisons de test simultanément dans différents conteneurs.Avec la suggestion de @ sharedhil, vous pouvez
docker-compose
intégrer un script qui échouera si des conteneurs échouent.Ensuite, sur votre serveur CI, passez simplement
docker-compose up
à./docker-compose.sh up
.la source
docker-rails vous permet de spécifier le code d'erreur du conteneur renvoyé au processus principal, afin que votre serveur CI puisse déterminer le résultat. C'est une excellente solution pour le CI et le développement de rails avec docker.
Par exemple
dans votre
docker-rails.yml
donnera leweb
code de sortie des conteneurs à la suite de la commandedocker-rails ci test
.docker-rails.yml
est juste un méta wrapper autour du standarddocker-compose.yml
qui vous donne le potentiel d'hériter / de réutiliser la même configuration de base pour différents environnements, c'est-à-dire développement vs test vs parallel_tests.la source
Au cas où vous pourriez exécuter plus de services de composition de docker avec le même nom sur un moteur de docker et que vous ne connaissez pas le nom exact:
echo %?
- renvoie le code de sortie du service test-chromeAvantages:
la source
Vous pouvez voir l'état de sortie avec:
echo $(docker-compose ps | grep "servicename" | awk '{print $4}')
la source
docker-compose ps | grep servicename | grep -v 'Exit 0' && echo "Automation or integration tests failed." && exit 1