【发布时间】:2020-05-22 20:47:16
【问题描述】:
我在以相对通用的方式将一些环境参数传递给docker run 时遇到了一些问题。
我们的第一次迭代是通过以下几行将.env 文件加载到环境中:
set -o allexport;
. "${PROJECT_DIR}/.env";
set +o allexport;
然后手动键入--env VARNAME=$VARNAME 作为docker run 命令的选项。但是当你有几十个变量时,这可能会很烦人。
然后我们尝试使用 --env-file .env 传递文件,它似乎可以工作,但它没有,因为它不能很好地与变量值周围的引号一起使用。
这是我开始做疯狂/丑陋事情的地方。基本的想法是做这样的事情:
set_docker_parameters()
{
grep -v '^$' "${PROJECT_DIR}/.env" | while IFS= read -r LINE; do
printf " -e %s" "${LINE}"
done
}
docker run $(set_docker_parameters) --rm image:label command
解析的行类似于VARIABLE="value"、VARIABLE='value' 或VARIABLE=value。空行被管道grep 丢弃。
但是docker run 一直抱怨没有被正确调用。当我扩展set_docker_parameters 的结果时,我得到了我所期望的结果,当我复制它的结果并替换$(set_docker_parameters) 时,docker run 也按预期工作,完美无缺。
知道我在这里做错了什么吗?
非常感谢!
P.S.:我正在尝试使我的脚本 100% 与 POSIX 兼容,因此我更喜欢任何不依赖 Bash 特定功能的解决方案。
【问题讨论】:
-
您的最终方法不适用于任何包含空格的变量。使用数组而不是字符串。
-
@jordanm 嗯.. 我检查了一下,当我在任何变量中没有空格时它确实有效。您有什么好的参考资料可以让我了解如何使用“数组”吗?
-
我看到 POSIX 规范中不存在数组,它们真的是解决该问题的唯一方法吗?我认为可能有一些不涉及复制粘贴变量定义的解决方法。
-
FAQ 中有一个 POSIX 示例。 POSIX shell 可以模拟带有位置参数的数组。
标签: bash shell docker sh posix