首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Bash函数中使用局部变量

如何在Bash函数中使用局部变量
EN

Stack Overflow用户
提问于 2017-02-10 10:36:07
回答 1查看 310关注 0票数 0

我正在尝试编写一个Bash脚本,它将停止Docker容器的存储库,重新构建它们,并在它们上运行一些测试(使用Pytest)。为了使代码变干,我尝试按以下方式定义一个函数wait_for_container

代码语言:javascript
运行
复制
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

然而,我发现这不起作用:我反复地得到

代码语言:javascript
运行
复制
nc: getaddrinfo: Temporary failure in name resolution
Waiting for the ipercroncompose_rethinkdb_1 container...

另一方面,下列非干脚本确实有效:

代码语言:javascript
运行
复制
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

和回声

代码语言:javascript
运行
复制
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.

然后是Pytest的结果。如何改进wait_for_container功能以达到同样的效果?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-10 11:20:50

以下是Grisha LevitFred的评论,以下是改编后的脚本:

代码语言:javascript
运行
复制
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地址作为它的第一个输入,而不是一个Docker容器名称。(我还将ADDR变量设置为局部变量)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42157224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档