【发布时间】:2020-11-20 08:23:46
【问题描述】:
我正在尝试编写一个应该启动 docker 容器的 shell 脚本。
我有一个正在运行的示例,但它使用 /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 命令并将结果分配给变量?
【问题讨论】:
-
不是
/bin/sh通常符号链接到bash(或dash在基于debian 的系统上,或zsh在macos 上) -
我已经重写了我的帖子。
-
export RES=$(.. does not work in #!/bin/sh? “不工作”是什么意思?请首先使用 shellcheck.net 检查您的脚本if [ $? -eq 1 ]; then是反模式,请执行if ! command args args args; then。 -
您也可以尝试使用反引号:
FOO=`docker run ...`。 -
@jakub 你不是在回答你自己的问题吗?
/bin/sh通常与 something 符号链接,但 something 是一个移动的目标。dash非常接近于基本的 POSIXsh。zsh是一个完全独立的蠕虫罐(尽管它可以设置为模拟bash和sh)。