Docker容器端口无法立即使用

时间:2017-10-13 07:32:58

标签: docker jenkins docker-compose jenkins-pipeline

我有Jenkins来构建我的项目并运行我的单元测试和集成测试。 在此之前,Jenkins正在启动多个docker容器(内置mongodbcassandra等)然后启动。 有时,我的测试失败是因为他们无法访问资源。 挖了一下后,我注意到并非所有的容器都开始了。 所以这就是我所拥有的:

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. 我如何才能正确等待所有人真正开始?

  3. 编辑:我认为我的问题是有时某些容器无法启动。 我的问题:我该如何调查?

1 个答案:

答案 0 :(得分: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>

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