You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 16:32:33