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