我正在尝试将我拥有的 docker 命令的某些部分分离到 bash 变量中。
我以前所做的事情,效果很好:
DOCKER_ID=$(docker run -e CGO_ENABLED=true -e LDFLAGS='-extldflags "-static"' -v $pkgPath:/src ...etc)
将-e
标志放入变量并尝试使用该变量:
BUILDER_ARGS="-e CGO_ENABLED=true -e LDFLAGS='-extldflags \"-static\"'"
DOCKER_ID=$(docker run $BUILDER_ARGS -v $pkgPath:/src ...etc)
第二个版本给出了错误:
docker: Error parsing reference: "\"-static\"'" is not a valid repository/tag.
这让我认为我试图插入的变量以某种方式被破坏了。
答案1
问题是 的值BUILDER_ARGS
不会被重新解释,因此转义的引号会被按字面意思理解,而不会执行其通常的功能,即引用封闭的字符串。不转义引号也不会起作用,因为在表达式中docker run
,BUILDER_ARGS
的值LDFLAGS
将在空格处被拆分。
使用 Bash 数组应该可以解决这些问题:
BUILDER_ARGS=(-e CGO_ENABLED=true -e LDFLAGS='-extldflags "-static"')
DOCKER_ID=$(docker run "${BUILDER_ARGS[@]}" -v $pkgPath:/src ...etc)
这会起作用,因为BUILDER_ARGS
数组中的每个元素都将被保留并正确引用。数组的最后一个值是LDFLAGS='-extldflags "-static"'
,就像这样,作为一个整体,它在 中被很好地保存并按预期执行docker run
。