我面临一些问题,无法以相对通用的方式将一些环境参数传递给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 .:我正在尝试使我的脚本与POSIX 100%兼容,因此,我希望使用任何不依赖于Bash特定功能的解决方案。
docker_run_wrapper()
{
# That's not ideal, but in any case it's not directly related to the question.
cmd=$1
set --; # Unset all positional arguments ($@ will be emptied)
# We don't have arrays (we want to be POSIX compatible), so we'll
# use $@ as a sort of substitute, appending new values to it.
grep -v '^$' "${PROJECT_DIR}/.env" | while IFS= read -r LINE; do
set -- "$@" "--env";
set -- "$@" "${LINE}";
done
# We use $@ in a clearly non-standard way, just to expand the values
# coming from the .env file.
docker run "$@" "image:label" /bin/sh -c "${cmd}";
}
然后,这不是我为特定用例编写的代码,而是一种简化的显示基本思想的代码。如果您可以依靠使用Bash,那么可以通过不重载$@
和使用数组来使它更干净。