我正在尝试向--env VAR1 --env VAR2 --env-file env.list
提供动态生成的docker run
环境变量列表。
不幸的是它没有用。
--env
映射变量,变量在容器中不可见。--env-file
提供的文件,docker抱怨它无法找到该文件:docker: open "env.list": no such file or directory.
详情
运行:
# env_params contains either --env or --env-file arguments
MY_VAR=123
env_params='--env "MY_VAR"'
echo ${env_params}
docker run -it --rm \
${env_params} \
my_docker_image env | grep MY_VAR
不会输出任何内容。容器内部看不到MY_VAR
。但是:
MY_VAR=123
docker run -it --rm \
--env "MY_VAR" \
my_docker_image env | grep MY_VAR
将起作用,123
将被打印。
以类似的方式--env-file
在通过env_params
提供时不起作用,但在直接提供给docker run
命令时可以正常工作。
我做错了什么?
答案 0 :(得分:0)
这里有两个问题。
首先,当你在你的shell中运行时:
MY_VAR=123
您不设置环境变量。您已设置本地shell变量。当您使用--env MY_VAR
时,您告诉Docker您希望在容器内部使用 environment 变量MY_VAR
,并且由于它不存在,您什么都得不到:< / p>
$ MY_VAR=123
$ docker run -it --rm -e MYVAR alpine env | grep MY_VAR
<crickets>
如果您首先将其导出到环境中:
$ export MY_VAR=123
$ docker run -it --rm -e MYVAR alpine env | grep MY_VAR
MY_VAR=123
然后它将按预期工作。或者,您可以使用VARNAME=VARVALUE
选项的--env
形式:
docker run -e "MY_VAR=${MY_VAR}" ...
第二个问题与shell变量插值的工作原理有关。如果你有:
env_params='--env "MY_VAR"'
docker run -it --rm \
${env_params} \
alpine env
然后生成的命令行是:
docker run -it --rm --env '"MY_VAR"' alpine env
也就是说,您传递给docker run
的参数包含文字双引号。您可以通过使用eval
语句来解决这个问题(请记住,您需要将脚本修改为export MY_VAR
):
eval docker run -it --rm \
${env_params} \
alpine env | grep MY_VAR
或者(我会优先考虑)你可以将env_params
变量用作数组,只要你使用bash
:
env_params=(--env MY_VAR)
env_params+=(--env SOME_OTHER_VAR)
docker run -it --rm \
"${env_params[@]}" \
alpine env | grep MY_VAR
这将导致正确的命令行:
docker run -it --rm --env MY_VAR --env SOME_OTHER_VAR alpine env
我想这里的摘要是你的问题最终与“如何docker run
解释动态生成的参数”无关,而是与“shell变量和插值工作原理”有关。