【问题标题】:Why is the env variable not set when entrypoint is echo on docker run?当入口点在 docker run 上回显时,为什么未设置 env 变量?
【发布时间】:2019-06-12 22:09:42
【问题描述】:

为什么环境变量对作为入口点运行的命令不可见?
示例:

$docker run -it -e "name=JD" --entrypoint 'echo' ubuntu 'Hello $name'
Hello $name  
$ docker run -it -e "name=JD" --entrypoint 'echo' ubuntu "Hello $name"
Hello  

但是当我启动 shell 时,环境变量就在那里:

$ docker run -it -e "name=JD" ubuntu /bin/bash
root@c3e513390184:/# echo "$name"
JD

为什么在以echo 作为入口点的第一种情况下,它找不到环境变量集?

【问题讨论】:

    标签: docker docker-entrypoint docker-run


    【解决方案1】:

    第一种情况

    docker run -it -e "name=JD" --entrypoint 'echo' ubuntu 'Hello $name'
    

    单引号始终防止字符串变量扩展。用单引号写的任何内容都保持不变。在您的终端中尝试echo '$PWD',您将看到$PWD 作为输出。试试echo "$PWD",你会打印出你的工作目录。

    第二种情况

    docker run -it -e "name=JD" --entrypoint 'echo' ubuntu "Hello $name"
    

    您的代码正在运行 Docker 之前被扩展。您的 shell 扩展整个字符串,然后执行它。此时你没有声明$name,你得到它是空的。这意味着在容器内你会得到"Hello " 命令,而不是"Hello $name"

    如果你想从容器内回显环境变量,最简单的方法是将脚本包装到 sh-file 以防止其扩展并将此文件传递给容器。

    我猜第三种情况很明显,不需要解释。

    【讨论】:

    • 我在第一种情况下使用单引号的原因正是因为我的shell没有替换变量,而是传递给docker进行参数替换。我也尝试了'hello \"$name\"',但这给出了一个错误。那么没有包装脚本就没有办法做到这一点?
    猜你喜欢
    • 2020-01-26
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    相关资源
    最近更新 更多