我有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
正如你可以看到其中一些已經有端口號,其中一些沒有。 我有兩個問題:
爲什麼端口號不可用?是因爲一些碼頭殭屍程序?如果是這樣,我該如何清理起來?
我該如何正確地等待所有他們真的開始?
編輯:我認爲我的問題是,有時一些容器不啓動。 我的問題:我該如何調查?
根據操作系統(diff命令),您可以手動檢查是否有任何進程正在佔用您需要的端口,並且可以清除它。 – Shanky