我有Jenkins
来构建我的项目并运行我的单元测试和集成测试。
在此之前,Jenkins
正在启动多个docker容器(内置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
正如您所看到的,其中一些已经有端口号,而其中一些还没有。 我有两个问题:
为什么端口号不可用?是因为一些码头僵尸的过程?如果是这样,我该如何清理?
我如何才能正确等待所有人真正开始?
编辑:我认为我的问题是有时某些容器无法启动。 我的问题:我该如何调查?
答案 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>
这可能会或可能不会解决您的其他问题,但可能是一个好的开始。