docker如何解释动态生成的--env参数

时间:2018-02-15 13:00:23

标签: bash environment-variables

我正在尝试向--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命令时可以正常工作。

我做错了什么?

1 个答案:

答案 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变量和插值工作原理”有关。