【问题标题】:How does docker run interpret dynamically generated --env argumentsdocker run 如何解释动态生成的 --env 参数
【发布时间】:2018-02-15 13:00:23
【问题描述】:

我正在尝试向docker run 提供动态生成的--env VAR1 --env VAR2 --env-file env.list 环境变量列表。

不幸的是,它不起作用。

  • 对于--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 命令时将起作用。

我做错了什么?

【问题讨论】:

    标签: bash environment-variables


    【解决方案1】:

    这里有两个问题。

    首先,当你运行时,在你的 shell 中:

    MY_VAR=123
    

    没有设置环境变量。您已经设置了一个本地 shell 变量。当你使用--env MY_VAR 时,你是在告诉 Docker 你想让 environment 变量 MY_VAR 在容器内可用,因为它不存在,所以你什么也得不到:

    $ 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
    

    然后它将按您的预期工作。或者,您可以使用 --env 选项的 VARNAME=VARVALUE 形式:

    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 变量和插值如何工作”有关。

    【讨论】:

    • :) 不错!现在检查一下。
    • 谢谢!数组解决方案和删除env_params='--env "MY_VAR"'MY_VAR 周围的额外引用都修复了解决方案。在我的情况下,变量导出不是问题,因为我是从环境中接收它们的(我只是在简化示例时犯了错误)。谢谢!
    猜你喜欢
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    相关资源
    最近更新 更多