2017-10-13 70 views
0

我有Jenkins建立我的項目並運行我的單元測試和集成測試。 在此之前,Jenkins正在啓動幾個碼頭集裝箱(內部有mongodb,cassandra等),然後啓動。 有時,我的測試失敗,因爲他們無法獲取資源。 挖了一下後,我注意到並非所有的容器都開始了。 因此,這裏是我:碼頭集裝箱港口立即不可用

docker-compose.yml每個docker容器的定義

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 

正如你可以看到其中一些已經有端口號,其中一些沒有。 我有兩個問題:

  1. 爲什麼端口號不可用?是因爲一些碼頭殭屍程序?如果是這樣,我該如何清理起來?

  2. 我該如何正確地等待所有他們真的開始?

編輯:我認爲我的問題是,有時一些容器不啓動。 我的問題:我該如何調查?

+0

根據操作系統(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會工作。謝謝。 –