如何用 /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)。
我正在尝试编写一个 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)。