【问题标题】:Use environment variables in CMD在 CMD 中使用环境变量
【发布时间】:2014-05-29 01:39:59
【问题描述】:

我可以在 Dockerfile 的 CMD 节中使用环境变量吗?

我想做这样的事情:

CMD ["myserver", "--arg=$ARG", "--memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT"]

$MEMCACHE_11211_TCP_* 将通过包含我的docker run 命令的 --link 参数自动设置。并且 $ARG 可以由用户在运行时配置,也许可以通过“-e”参数?

这似乎对我不起作用,例如,它似乎实际上是通过字符串“$ARG”。

【问题讨论】:

    标签: environment-variables docker


    【解决方案1】:

    这个答案可能有点晚了。但是 CMD 的环境会根据您编写参数的方式略有不同。如果您将CMD 作为字符串(不在数组内)传递,它将作为shell 而不是exec 启动。见https://docs.docker.com/engine/reference/builder/#cmd

    您可以尝试不使用数组语法的 CMD 作为 shell 运行:

    CMD myserver --arg=$ARG --memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT
    

    【讨论】:

    • 如果您使用CMD string 方法,当您使用docker run my-imageCtrl-C 可能会停止工作,因为shell 获取中断而不是由CMD 启动的进程。
    【解决方案2】:
    CMD ["sh", "-c", "echo ${MY_HOME}"]
    

    来自 sffits 的回答 here

    【讨论】:

      【解决方案3】:

      两个安迪都说对了。 json 语法绕过入口点。当您在他们的示例中使用 CMD 时,它被视为默认入口点的参数:/bin/sh -c,它将解释环境变量。

      在这两种情况下,Docker 都不评估 CMD 中的变量。前者直接调用命令,不解释,后者由sh解释变量。

      【讨论】:

        【解决方案4】:

        我无法说明它是如何工作的,应该,但我认为如果你将其称为 shell 脚本,例如CMD runmyserver.sh,那么 shell 变量的解释将推迟到 CMD 实际运行。

        所以,试试

        myserver --arg=$ARG --memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT`` 
        

        作为 shell 脚本?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-31
          • 1970-01-01
          • 1970-01-01
          • 2020-02-13
          • 1970-01-01
          相关资源
          最近更新 更多