gpt4 book ai didi

bash - 本地机器覆盖的 Docker 镜像环境变量

转载 作者:行者123 更新时间:2023-12-02 20:59:39 25 4
gpt4 key购买 nike

为什么在查看env的时候对于我创建的图像,我得到了按预期列出的图像环境变量,但是当我尝试访问其中一个环境变量(即 $PATH)时,我得到的是本地机器环境变量输出吗?

我相信我误解了 docker 环境变量是如何工作的。我正在尝试对 docker 容器运行一些命令,并且看到了我认为的意外行为。我创建了一个简单的示例来尝试演示。

Dockerfile:

FROM node:12.13.0 

ENV PATH="${PATH}:/custom-path/goes-here"

命令:
  • docker build . -tag env-test
  • docker run env-test /bin/bash -c "env"
  • docker run env-test /bin/bash -c "$PATH"

  • 最后两个命令的预期输出。
  • docker run env-test /bin/bash -c "env".
  • ...
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/custom-path/goes-here
    ...
  • docker run evn-test /bin/bash -c "echo $PATH"
  • /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/custom-path/goes-here

    最后两个命令的实际输出
  • docker run env-test /bin/bash -c "env".
  • ...
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/custom-path/goes-here
    ...
  • docker run evn-test /bin/bash -c "echo $PATH"
  • /Users/local-machine-user/Downloads/google-cloud-sdk/bin:/Users/local-machine-user/.nvm/versions/node/v12.16.1/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Users/local-machine-user/Downloads/google-cloud-sdk/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin

    运行 echo $PATH 的输出针对创建的图像返回我的本地机器 $PATH 变量。什么?

    我要做的主要事情是针对 docker 镜像执行一个脚本,该脚本需要我在镜像中设置的那些环境变量,但是脚本失败了,因为脚本使用的环境变量最终用于我的本地机器而不是那些图像中指定。

    最佳答案

    假设您正在尝试运行第三个示例

    docker run env-test /bin/bash -c "echo $PATH"

    这里发生的第一件事是您的本地 shell 处理此命令并执行其通常的一组扩展。例如,双引号中的环境变量引用被扩展。一旦构建了最终的命令行,shell 就会执行它。

    一个普遍有用的技巧是把 echo在命令的前面

    echo docker run env-test /bin/bash -c "echo $PATH"

    这将向您显示本应运行但实际上并未运行的命令。

    要完成这项工作,您需要使本地 shell 不扩展环境变量,以便您在容器中启动的 shell 可以执行此操作。单引号或反斜杠转义都适用于此

    docker run env-test /bin/sh -c 'echo $PATH'
    docker run env-test /bin/sh -c "echo \$PATH"

    The primary thing I'm trying to do is execute a script against the docker image that requires those environment variables I set in the image



    解决这个问题的最好方法可能是编写一个普通的 shell 脚本和 COPY它进入你的形象。这可以节省引用层和围绕哪个 shell 处理变量之类的东西的混淆。如果您无法修改镜像,另一种方法是从主机绑定(bind)挂载脚本。

    # If the script is in the image
    docker run --rm env-test path-echoer.sh

    # If not
    docker run --rm -v $PWD:/scripts env-test /scripts/path-echoer.sh

    关于bash - 本地机器覆盖的 Docker 镜像环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61110192/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com