如何用 /bin/sh 编写 docker 命令并将结果分配给变量?

How to write docker command with /bin/sh and assign result to variable?

我正在尝试编写一个 shell 脚本来启动一个 docker 容器。 我有一个 运行ning 示例,但它使用 /bin/bash:

#!/bin/bash

export NETWORK=jetty-svc-test
export IMAGE_TAG=jetty-test-app
export SVC_NAME=svc-test

clean_up() {
    docker stop $SVC_NAME
    docker network rm $NETWORK
}

docker network create $NETWORK
if [ $? -eq 1 ]; then
    exit 1
fi

docker build --tag $IMAGE_TAG .
if [ $? -eq 1 ]; then
    exit 1
fi

docker run -it --rm --name $SVC_NAME --network=$NETWORK -v $(pwd)/app:/app -d $IMAGE_TAG
if [ $? -eq 1 ]; then
    exit 1
fi
sleep 5

export RES=$(docker run --rm --network=$NETWORK curlimages/curl:7.71.1 http://$SVC_NAME:8080 | docker run --rm -i stedolan/jq .)
export HEALTH_CHECK=$(echo "$RES" | docker run --rm -i stedolan/jq -r .status)

if [ "$HEALTH_CHECK" != "I am healthy" ]; then
    clean_up
    exit 1
fi

clean_up

但我在 #!/bin/sh 中需要它。例如,语句 export RES=$(..#!/bin/sh 中不起作用。

我需要重写上面的脚本,因为https://hub.docker.com/layers/docker/library/docker/19.03.12/images/sha256-d208a88b6afa09430a2f4becbc8dbe10bfdaeb1703f9ff3707ca96e89358a8e4?context=explore只支持#!/bin/sh,我想运行上面的脚本放在docker:dind容器里。

如何用 /bin/sh 编写 docker 命令并将结果赋值给变量?

如评论中所述,您可以再次检查脚本shellcheck,我不会在shell脚本中解决该问题,因为评论中的建议应该有效,但我会只是通过扩展 docker:dind 创建自定义图像,它将具有 bash 以及您正在尝试的其他实用程序,为 jq 等拉取 docker 图像,

通过这种方法,您将节省网络带宽和 CPU 时间。

FROM docker:dind
RUN apk add --no-cache bash jq curl

现在 运行 这个 docker:dind 图片而不是官方图片,您的脚本将变成类似

docker run -dit --rm --name $SVC_NAME -p 3000:3000 --network=$NETWORK  jetty-test-app:latest
if [ $? -eq 1 ]; then
    exit 1
fi
sleep 2

RES=$(curl localhost:3000/users | jq .)

export HEALTH_CHECK=$(echo "$RES" | jq .status)

if [ "$HEALTH_CHECK" != "I am healthy" ]; then
    clean_up
    exit 1
fi
clean_up

你好像在问如何重写

export variable=$(command)
export other="value"

POSIX sh 的答案很简单

variable=$(command)
export variable

other="value"
export other

另见 Where is “export var=value” not available? (on Unix / Linux Stack Exchange)