通过.env文件的命令扩展为docker run生成参数

问题描述 投票:0回答:1

我面临一些问题,无法以相对通用的方式将一些环境参数传递给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特定功能的解决方案。

bash shell docker sh posix
1个回答
0
投票
根据@jordanm的评论,我设计了以下解决方案:

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,那么可以通过不重载$@和使用数组来使它更干净。
© www.soinside.com 2019 - 2024. All rights reserved.