J'ai Jenkins
pour construire mon projet et exécuter mon test d'unité et test d'intégration. Avant tout cela, Jenkins
lance plusieurs conteneurs docker (avec mongodb
, cassandra
etc à l'intérieur) et puis il commence. Parfois, mes tests échouent parce qu'ils ne peuvent pas atteindre les ressources. Après avoir creusé un peu j'ai remarqué que tous mes conteneurs ne commencent pas. Voici donc ce que j'ai:Les ports du conteneur Docker ne sont pas disponibles immédiatement
docker-compose.yml
avec la définition de chaque conteneur docker
scénario start_docker.sh
:
time docker-compose pull
time docker-compose --project-name $JOB_NAME up -d
time docker-compose --project-name $JOB_NAME ps
echo "Wait services are started"
docker-compose --project-name $JOB_NAME ps -q
container_names=`docker-compose --project-name $JOB_NAME ps -q`
container_nb="${#container_names}"
for container_name in $container_names; do
ports=`docker port $container_name | cut -d "/" -f1 `
service_ip=`docker inspect $container_name | grep "IPAddress" | grep 172 | sed "s/[^0-9]*\\([0-9\\.]\\+\\)[^0-9]*/\\1/"`
for port in $ports; do
while ! nc -z $service_ip $port; do
sleep 1 # wait for 1 second before check again
done
done
done
Ce que j'ai remarqué est que parfois la variable ports
est vide pour certains conteneurs et si je les affiche ici est ce que je vois:
[unit_test] target2sellcoredevelop_dse_1 /etc/dse/run.sh Up
[unit_test] target2sellcoredevelop_mongo_1 docker-entrypoint.sh mongo ... Up
[unit_test] target2sellcoredevelop_pentaho-pdi_1 /bin/sh -c /bin/bash -c "/ ... Up 0.0.0.0:9999->9999/tcp
[unit_test] target2sellcoredevelop_rabbitmq_1 docker-entrypoint.sh /init.sh Up
[unit_test] target2sellcoredevelop_redis_sentinel1_1 docker-entrypoint.sh sh -c ... Up
[unit_test] target2sellcoredevelop_rediscachereco_master_1 docker-entrypoint.sh redis ... Up
[unit_test] target2sellcoredevelop_rediscatalog_master_1 docker-entrypoint.sh redis ... Up
[unit_test] target2sellcoredevelop_redisuser_master_1 docker-entrypoint.sh redis ... Up
Comme vous pouvez voir certains d'entre eux ont déjà le numéro de port et certains d'entre eux ne le font pas. J'ai 2 problèmes:
Pourquoi le numéro de port ne sont pas disponibles? Est-ce parce que certains processus docker zombie? Si oui, comment puis-je nettoyer?
Comment puis-je attendre que tout commence réellement?
EDIT: Je pense que mon problème est que parfois certains conteneurs ne démarrent pas. Ma question: comment puis-je enquêter?
En fonction du système d'exploitation (commandes diff), vous pouvez vérifier manuellement si un processus occupe le port dont vous avez besoin et l'effacer également. – Shanky