2017-02-10 8 views
0

私は、Dockerコンテナのリポジトリを停止し、再ビルドし、Pytestを使っていくつかのテストを実行するBashスクリプトを作成しようとしています。コードのDRYを作るために、私は次のように機能wait_for_containerを定義しようとしました:私は繰り返し、一方ローカル変数をBash関数で使用する方法

nc: getaddrinfo: Temporary failure in name resolution 
Waiting for the ipercroncompose_rethinkdb_1 container... 

を得る:

docker stop $(docker ps -a -q) 

docker-compose build 

docker-compose up -d 

function wait_for_container { 
    local CONTAINER=$1 
    local PORT=$2 

    ADDR=$(docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $CONTAINER) 

    until nc -z $CONTAINER $PORT 
    do 
     echo "Waiting for the $CONTAINER container..." 
     sleep 0.5 
    done 
    echo "$CONTAINER listening at $ADDR:$PORT" 
} 

RETHINKDB_CONTAINER=ipercroncompose_rethinkdb_1 
RETHINKDB_PORT=28015 
wait_for_container $RETHINKDB_CONTAINER $RETHINKDB_PORT 

RABBITMQ_CONTAINER=ipercroncompose_rabbitmq_1 
RABBITMQ_PORT=5672 
wait_for_container $RABBITMQ_CONTAINER $RABBITMQ_PORT 

cd test 
pytest 

をしかし、私はこれが動作していないことが判明します非DRYスクリプトに従うこと作業を行います。

docker stop $(docker ps -a -q) 

docker-compose build 

docker-compose up -d 

RETHINKDB_CONTAINER=ipercroncompose_rethinkdb_1 
RETHINKDB_ADDR=$(docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $RETHINKDB_CONTAINER) 
RETHINKDB_PORT=28015 

until nc -z $RETHINKDB_ADDR $RETHINKDB_PORT 
do 
    echo "Waiting for the RethinkDB container..." 
    sleep 0.5 
done 
echo "RethinkDB listening at ${RETHINKDB_ADDR}:${RETHINKDB_PORT}." 

RABBITMQ_CONTAINER=ipercroncompose_rabbitmq_1 
RABBITMQ_ADDR=$(docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $RABBITMQ_CONTAINER) 
RABBITMQ_PORT=5672 

until nc -z $RABBITMQ_ADDR $RABBITMQ_PORT 
do 
    echo "Waiting for the RabbitMQ container..." 
    sleep 0.5 
done 
echo "RabbitMQ listening at ${RABBITMQ_ADDR}:${RABBITMQ_PORT}." 

cd test 
pytest 

をして

をエコー
RethinkDB listening at 172.18.0.2:28015. 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
Waiting for the RabbitMQ container... 
RabbitMQ listening at 172.19.0.2:5672. 

であり、その後にPytestsの結果が続きます。同じ効果を得るために、どのようにしてwait_for_containerの機能を改善できますか?

+1

私は大雑把な一見で何か間違っているとは思わないが(おそらく変数の拡張を引用するべきであるが、あなたのサンプルデータは引用符で囲まれていない拡張では問題にはならない)、不思議なことに 'nc'ユーティリティが呼ばれているようだ。スクリプトにログを追加して、実行時に 'nc'コマンド全体が実際にどのように見えるかを確認できますか? – Fred

+1

ちなみに、コードの重複を避けるための関数を使用する方法がありますが、それがうまくいかない理由はありませんので、これを実行する時間を取ってください(おそらく、関数をまったく使用することには関係しません)。 – Fred

+1

'nc -z $ CONTAINER $ PORT' ==>'〜nc -z $ ADDR $ PORT' –

答えて

0

Grisha Levit年代とFredのコメントに続いて、ここに適応したスクリプトです:

docker stop $(docker ps -a -q) 
docker-compose build 
docker-compose up -d 

function wait_for_container { 
    local CONTAINER=$1 
    local PORT=$2 

    local ADDR=$(docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $CONTAINER) 
    echo $ADDR 

    until nc -z $ADDR $PORT 
    do 
     echo "Waiting for the $CONTAINER container..." 
     sleep 0.5 
    done 
    echo "$CONTAINER listening at $ADDR:$PORT" 
} 

wait_for_container ipercroncompose_rethinkdb_1 28015 
wait_for_container ipercroncompose_rabbitmq_1 5672 

cd test 
pytest 

問題はnetcatは、その最初の入力ではなく、ドッカーコンテナ名としてIPアドレスが必要であることを確かにしました。 (私もADDR変数をローカルにしました)。

+1

一般的なコードの慣例では、大文字の変数は環境変数のためにのみ使用されます。 – Inian

関連する問題