码头集装箱港口立即不可用

问题描述:

我有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

您有许多不同的问题,但在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会工作。谢谢。 –