Docker 参数与变量中的空格。如何使用它>



我已经在stackoverflow(和谷歌)上搜索了3个小时的答案,但没有找到正确的解决方案。

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

我有一个带有码头工人参数的字符串: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 作为命令:

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而从输入中删除尾随空格和前导空格,并解释由于缺少斜杠序列或缺少-r而缺少斜杠序列。

ARG_LIST+=("--build-arg $ARG")

将值为--build-arg $ARG单个元素分配给数组。您稍后必须在build-arg$ARG之间的空间上拆分。而是分配两个元素 - 一个用于--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 数组。更喜欢使用小写变量名称。

最新更新