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 数组。更喜欢使用小写变量名。
我在 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 数组。更喜欢使用小写变量名。