如何在/bin/sh中编写Docker命令并赋值结果至变量及转换Bash脚本
把Docker启动脚本从Bash改为POSIX Shell兼容版本
要让你的脚本在/bin/sh(比如docker:dind环境中的shell)下正常运行,主要需要处理命令替换的兼容性问题,同时确保其他Bash特有的语法替换为POSIX标准写法。以下是修改后的完整脚本,以及关键修改点的说明:
修改后的完整脚本
#!/bin/sh NETWORK=jetty-svc-test IMAGE_TAG=jetty-test-app 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 --rm --name "$SVC_NAME" --network="$NETWORK" -v "$(pwd)/app:/app" -d "$IMAGE_TAG" if [ $? -eq 1 ]; then exit 1 fi sleep 5 # 使用反引号进行命令替换(POSIX sh兼容) RES=`docker run --rm --network="$NETWORK" curlimages/curl:7.71.1 http://"$SVC_NAME":8080 | docker run --rm -i stedolan/jq .` 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
关键修改说明
命令替换兼容性:
原脚本中的$()是Bash常用的命令替换语法,但部分旧的POSIX-compliant/bin/sh(比如BusyBox ash)对其支持有限。我们改用POSIX标准的**反引号`**来实现命令替换,这是所有/bin/sh都支持的写法。变量引用加引号:
给所有变量引用(比如"$SVC_NAME"、"$NETWORK")加上双引号,避免变量值包含空格或特殊字符时出现解析错误,这也是POSIX Shell的最佳实践。移除冲突的启动参数:
原脚本中docker run同时使用了-it(交互式终端)和-d(后台运行),这两个参数在后台运行场景下冲突,所以移除了-it,确保容器正常后台启动。简化变量导出逻辑:
在POSIX Shell中,如果变量仅在当前脚本内部使用,无需提前export(除非需要传递给子进程)。这里直接赋值变量,后续使用时引用即可,减少不必要的环境变量导出。
额外提示
如果你使用的/bin/sh是较新的版本(比如Docker官方镜像中的ash),其实也支持$()语法,但使用反引号能确保最大兼容性,适配所有POSIX-compliant环境。
内容的提问来源于stack exchange,提问作者softshipper
相关产品推荐
相关产品推荐

