2017-10-13 1 views
0

私はJenkinsプロジェクトをビルドし、ユニットテストと統合テストを実行しています。 これの前に、Jenkinsはいくつかのドッカーコンテナ(mongodbcassandraなどが入っています)を起動してから起動します。 リソースにアクセスできないため、テストが失敗することがあります。 ちょっと掘り出した後、私のコンテナがすべて始まっていないことに気付きました。だからここ は、私が持っているものである。各dockerコンテナの定義とドッカーコンテナポートがすぐに利用できない

docker-compose.yml

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 

私が気づいたことは、時にはports変数は、いくつかのコンテナの空であることです私がここに表示しているのは、私が見るものです:

[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 

あなたが見ることができるように、それらのいくつかは既にポート番号を持っていて、それらのいくつかは持っていません。 私は2つの問題があります:

  1. なぜポート番号が利用できないのですか?いくつかのドッカーのゾンビのプロセスのためですか?もしそうなら、どのように私はきれいにすることができますか?

  2. どうすれば実際にそれらが本当に始まるのを待つことができますか?

EDIT:私の問題は、時には一部のコンテナが起動しないことがあると思います。 私の質問:どうすればそれを調べることができますか?

+0

OSに応じて(diffコマンド)、必要なポートを占有しているプロセスがあるかどうかを手動でチェックして、それをクリアすることもできます。 – Shanky

答えて

2

さまざまな質問がありますが、Docker Composeでは、特定のコンテナがdadarek/wait-for-dependenciesを使用する前に起動するのを待つことができます。

1)。 docker-compose.ymlに新しいサービスを追加する

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

2)。 MongoDBを起動する必要があるサービスに以下の設定を追加してください。これは本質的にMongoDBが完全にアップするのを待つでしょう。

depends_on: 
    - waitfordb 

3)。スタートアップの構成

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

これは、他の問題を解決する場合もありますが、開始するのが適切な場合があります。

+0

これを追加しました。私はiitが動作するのを見るでしょう。ありがとう。 –

関連する問題