2017-10-13 3 views
0

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:

  1. Pourquoi le numéro de port ne sont pas disponibles? Est-ce parce que certains processus docker zombie? Si oui, comment puis-je nettoyer?

  2. 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?

+0

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

Répondre

2

Vous avez un certain nombre de questions différentes, mais dans Docker Compose, vous pouvez attendre que certains conteneurs apparaissent avant les autres en utilisant dadarek/wait-for-dependencies.

1). Ajoutez un nouveau service à votre docker-compose.yml

waitfordb: 
    image: dadarek/wait-for-dependencies 
    depends_on: 
     - mongodb 
    command: mongodb:27017 

2). Ajoutez la configuration suivante au service qui requiert que MongoDB soit actif. Cela va essentiellement attendre que MongoDB soit pleinement opérationnel.

depends_on: 
    - waitfordb 

3). Démarrage composer

docker-compose run --rm waitfordb 
docker-compose up -d <SERVICE_1> <SERVICE_2> 

Ceci peut résoudre ou non vos autres problèmes, mais peut être un bon point de départ.

+0

Ok, j'ai ajouté ceci. Je vais voir ça va marcher. Merci. –