Docker 带有变量空格的参数。使用方法>

Docker args with whitespaces from variable. How to use it>

我在 Whosebug(和 google 上搜索了 3 个小时的答案,但没有找到正确的解决方案。

在我的 CI 中需要动态添加 docker 构建参数。我需要从环境变量中使用它。

我有一个带有 docker arg 的字符串: DOCKER_ARGS="CURL_ARGS='-k https://example.invalid/'|ARG2=As|ARG3=asdas"

在我的 *.sh 中我写了一些代码:

DOCKER_ARGS="CURL_ARGS='-k https://example.invalid/'|ARG2=As|ARG3=asdas"
if [ ! -z "$DOCKER_ARGS" ]; then 
    ARG_LIST=()
    while read -d"|" ARG || [[ -n "$ARG" ]];
    do 
    ARG_LIST+=("--build-arg $ARG")
    done <<<$DOCKER_ARGS
fi
docker build -t test . ${ARG_LIST[@]}

当我使用 echo ${ARG_LIST[@]} 时,我收到正确的结果:

--build-arg CURL_ARGS='-k https://example.invalid/' --build-arg ARG2=As --build-arg ARG3=asdas

但是当我使用 docker build -t test . ${ARG_LIST[@]} 时它给了我一个错误:

"docker build" 恰好需要 1 个参数。

如果我对命令使用回显:

echo "docker build -t test . ${ARG_LIST[@]}" - 我的结果是正确的

我希望它可以作为:

docker build -t image:tag . --build-arg CURL_ARGS='-k https://example.invalid/' --build-arg ARG2=As --build-arg ARG3=asdas

你的脚本有一些问题。

DOCKER_ARGS="CURL_ARGS='-k https://example.invalid/'|ARG2=As|ARG3=asdas"

使用当前处理 CURL_ARGS 将设置为 '-k https://example.invalid/' ,包括引号 。从输入中删除引号,或者编写您自己的取消引用删除例程。

read -d"|" ARG

由于 IFS 从输入中删除尾随和前导白色 space 并解释由于或缺少 -r.

而丢失的斜线序列
ARG_LIST+=("--build-arg $ARG")

将值为 --build-arg $ARG 单个 元素分配给数组。您稍后必须在 build-arg$ARG 之间拆分 space。而是分配 两个 元素 - 一个用于 --build-arg,另一个用于 $ARG.

更好的脚本可能如下所示:

docker_args="CURL_ARGS=-k https://example.invalid/|ARG2=As|ARG3=asdas"
arg_list=()
if [[ -n "$docker_args" ]]; then 
    # split input on `|` 
    # Potentially use readarray to handle newlines
    IFS='|' read -r -a args <<<"$docker_args"
    # Add --built-arg to arrays
    for arg in "${args[@]}"; do
        # Proper quoting
        arg_list+=(--build-arg "$arg")
    done
fi
#                      proper quoting
docker build -t test . "${arg_list[@]}"

http://shellcheck.net 检查你的脚本。重新研究 shell 中引用的工作原理并使用 bash 数组。更喜欢使用小写变量名。