簡體   English   中英

Docker容器端口立即不可用

[英]Docker container ports not available right away

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

如您所見,其中有些已經具有端口號,而有些則沒有。 我有2個問題:

  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)。 將以下配置添加到需要啟動MongoDB的服務中。 這實際上將等待MongoDB完全啟動。

depends_on: 
  - waitfordb

3)。 啟動撰寫

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

這可能會或可能不會解決您的其他問題,但可能是一個不錯的起點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM