Docker容器端口不可用

我有Jenkinsbuild立我的项目,并运行我的unit testing和集成testing。 在此之前, Jenkins推出了几个docker集装箱(内部有mongodbcassandra等),然后启动。 有时,我的testing失败,因为他们无法获得资源。 挖了一下后,我注意到并不是所有的容器都开始了。 所以这里是我所拥有的:

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 

我注意到有时候portsvariables对于某些容器是空的,如果我在这里显示它们就是我所看到的:

 [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. 为什么端口号不可用? 是因为一些docker僵尸程序? 如果是这样,我该怎么清理呢?

  2. 我该如何等待他们真的开始呢?

编辑:我认为我的问题是,有时一些容器不启动。 我的问题:我该如何调查?

您有许多不同的问题,但是在Docker Compose中,您可以等待某些容器出现在使用dadarek / wait-for-dependencies的其他容器之前。

1)。 添加一个新的服务到你的docker-compose.yml

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

2)。 将以下configuration添加到需要MongoDB的服务。 这将基本上等待MongoDB的全面启动。

 depends_on: - waitfordb 

3)。 启动撰写

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

这可能会或可能不会解决您的其他问题,但可能是一个很好的开始。