【问题标题】:Get Environment Variable from Docker Container从 Docker 容器中获取环境变量
【发布时间】:2016-03-07 05:25:18
【问题描述】:

从 Dockerfile 中未声明的 docker 容器获取环境变量的最简单方法是什么

例如,通过某个docker exec container /bin/bash 会话设置的环境变量?

我可以docker exec container env | grep ENV_VAR,但我更喜欢只返回值的东西。

我尝试使用docker exec container echo "$ENV_VAR",但替换似乎发生在容器之外,所以我没有从容器中获取环境变量,而是从我自己的计算机中获取环境变量。

谢谢。

【问题讨论】:

  • 有什么理由不想使用 env 和 grep?
  • 我只需要这个值。如果我理解正确,我需要解析 grep 调用的输出,我宁愿避免这样做。
  • 我以为在执行会话中设置的变量不会影响主进程或后续执行会话?

标签: bash docker environment-variables


【解决方案1】:

由于我们处理的是 JSON,并且与公认的答案不同,我们不需要执行容器。

docker inspect <NAME|ID> | jq '.[] | .Config.Env'

输出样本

[
  "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
  "NGINX_VERSION=1.19.4",
  "NJS_VERSION=0.4.4",
  "PKG_RELEASE=1~buster"
]

检索特定变量

docker inspect <NAME|ID> | jq -r '.[].Config.Env[]|select(match("^<VAR_NAME>"))|.[index("=")+1:]'

jq

【讨论】:

  • 这很好,但它并不能解决获取特定环境变量的问题。
  • 我用这个jq提取了一个特定的环境变量:docker inspect &lt;CONTAINER&gt; | jq -r '.[].Config.Env[]|select(match("^&lt;VAR&gt;"))|.[index("=")+1:]'
【解决方案2】:

在容器内运行echo "$ENV_VAR" 以便在容器中发生变量替换的正确方法是:

docker exec <container_id> bash -c 'echo "$ENV_VAR"'

【讨论】:

  • 请注意,所有这些答案都取决于某些外壳。我无法使用可执行文件和临时基础映像获取 env 变量。
  • docker run --rm -it CONTAINER bash -c 'echo "$MY_ENV_VAR"'
  • 我收到错误“错误:没有这样的容器:容器”。我通过 SSH 登录后正在执行命令。
  • @kunwarnitesh:你需要将“container”替换为你要操作的容器的名称。
  • 制作container 字,以便人们理解它是一个变量
【解决方案3】:

我们可以通过docker run命令修改非运行容器的entrypoint

示例显示 PATH 环境变量:

  1. 使用bashecho:这个answer 声称echo 不会产生任何输出,这是不正确的。

    docker run --rm --entrypoint bash <container> -c 'echo "$PATH"'
    
  2. 使用printenv

    docker run --rm --entrypoint printenv <container> PATH
    

【讨论】:

    【解决方案4】:

    如果您有任何机会使用VSCode 并安装了docker extension,只需+单击您要检查的泊坞窗(在@987654323 @),点击 Inspect,然后搜索env,你会找到你所有的env variables

    【讨论】:

      【解决方案5】:

      此命令检查主机中 docker stack 进程的环境:

      pidof   dockerd containerd containerd-shim | tr ' ' '\n' \
            | xargs -L1 -I{} -- sudo xargs -a '/proc/{}/environ' -L1 -0
      

      【讨论】:

        【解决方案6】:

        以上答案都没有向您展示如何从非运行容器中提取变量(如果您将echo 方法与run 一起使用,您将不会得到任何输出)。

        只需 runprintenv,就像这样:

        docker run --rm <container> printenv <MY_VAR>
        

        (请注意,docker-compose 而不是 docker 也可以)

        【讨论】:

        • 非常简单!我接受了这种方法。
        • 或只是printenv 打印所有变量。
        【解决方案7】:

        使用docker exec 的缺点是它需要一个正在运行的 容器,因此如果您不确定容器是否正在运行,docker inspect -f 可能会很方便。

        示例#1.输出指定容器中以空格分隔的环境变量列表:

        docker inspect -f \
           '{{range $index, $value := .Config.Env}}{{$value}} {{end}}' container_name
        

        输出将如下所示:

        ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3
        

        Example #2. 输出每个 env var 换行和grep 需要的项目,例如,mysql 容器的设置可以这样检索:

        docker inspect -f \
            '{{range $index, $value := .Config.Env}}{{println $value}}{{end}}' \
            container_name | grep MYSQL_
        

        将输出:

        MYSQL_PASSWORD=secret
        MYSQL_ROOT_PASSWORD=supersecret
        MYSQL_USER=demo
        MYSQL_DATABASE=demodb
        MYSQL_MAJOR=5.5
        MYSQL_VERSION=5.5.52
        

        示例 #3。 让我们修改上面的示例以获取 bash 友好 输出,该输出可以直接在您的脚本中使用:

        docker inspect -f \
           '{{range $index, $value := .Config.Env}}export {{$value}}{{println}}{{end}}' \
           container_name | grep MYSQL
        

        将输出:

        export MYSQL_PASSWORD=secret
        export MYSQL_ROOT_PASSWORD=supersecret
        export MYSQL_USER=demo
        export MYSQL_DATABASE=demodb
        export MYSQL_MAJOR=5.5
        export MYSQL_VERSION=5.5.52
        

        如果您想深入了解,请转到 Go 的 text/template 包文档,其中包含格式的所有详细信息。

        【讨论】:

        • 这是最好的答案。我认为应该是一个单独问题的答案(当容器关闭时)
        • 这是唯一对我有用的答案。 docker exec 总是说我的容器不知道。
        • 这是最好的答案,因为所有其他解决方案都使用docker exec,这取决于容器是否支持exec 的任何命令。另一方面,这个答案适用于任何容器,因为它只依赖于容器元数据。
        • 你能解释一下为什么$index吗?我读了golang.org/pkg/text/template,但仍然不明白为什么只使用一个变量时使用两个变量。
        • @Stefan,完整示例如下所示:{{range $key, $value := .State}}{{$key}}="{{$value}}"{{println}}{{end}}
        【解决方案8】:

        您可以使用printenv VARIABLE 代替/bin/bash -c 'echo $VARIABLE。它更简单,并且不执行替换:

        docker exec container printenv VARIABLE
        

        【讨论】:

        • 这应该是最终的答案
        • 或只是printenv 打印所有变量。
        • 这甚至适用于 kubernetes:kubectl exec pod-name printenv MY_VARIABLE。
        【解决方案9】:

        查看所有环境变量:

        docker exec container env
        

        得到一个:

        docker exec container env | grep VARIABLE | cut -d'=' -f2
        

        【讨论】:

        • 我的问题是我不想走那条路。另外,后续问题:docker exec container envdocker exec -it container /bin/bash 然后env 吐出不同的东西。为什么?
        • 啊...可能是我构建 docker 映像的特定方式,这使得这种情况...
        • 嗯,现在更难了。试试docker inspect container
        • docker inspect container 似乎也有同样的限制。如果我在运行容器后创建环境变量,它不会出现在对 docker inspect 的调用中(在 env 部分中)。
        • 如果VARIABLE 是从openssl rand -base64 14 生成的密码或VARIABLE 包含等号的任何其他情况,则说@aisbaa,然后cut -d'=' -f2 将在第二场比赛后遗漏所有内容,但是, cut -d '=' -f 2- 只会匹配第一个分隔符并打印之后的所有内容。
        【解决方案10】:

        @aisbaa 的答案有效,如果您不在乎何时声明环境变量。如果您想要环境变量,即使它已在 exec /bin/bash 会话中声明,请使用类似:

        IFS="=" read -a out <<< $(docker exec container /bin/bash -c "env | grep ENV_VAR" 2>&1)
        

        它不是很漂亮,但它完成了工作。

        要获取值,请使用:

        echo ${out[1]}
        

        【讨论】:

        • 查看 jwodder 的回答。
        猜你喜欢
        • 2020-07-24
        • 2017-07-16
        • 2018-06-17
        • 2016-12-28
        • 1970-01-01
        • 1970-01-01
        • 2016-05-30
        • 1970-01-01
        • 2019-01-09
        相关资源
        最近更新 更多