【问题标题】:How to set system-wide environment variables in dockerfile from a file inside the docker container?如何从 docker 容器内的文件在 dockerfile 中设置系统范围的环境变量?
【发布时间】:2018-07-02 08:13:48
【问题描述】:

我正在将交叉编译环境设置为 docker 容器。在构建过程中,我为嵌入式设备安装了 SDK:

ADD sdk.tar /opt
WORKDIR /opt/
RUN sdkinstall.sh

将sdk安装在文件夹/opt/sdk/

现在我有一个文件/opt/sdk/envsetup,其中包含一些环境变量:

export SDKTARGETSYSROOT=/opt/sdk/sysroots/cortexa9hf-vfp-neon-gad-linux-gnueabi
export PATH=/opt/sdk/sysroots/x86_64-gadsdk-linux/usr/bin:/opt/sdk/sysroots/x86_64-gadsdk-linux/usr/bin/arm-gad-linux-gnueabi:$PATH
export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT

.... and so on

通常,当我在容器中运行 shell 时,我会执行 source /opt/sdk/envsetup,然后从 shell 编译内容。

但是,我想要实现的是,所有这些环境变量都存在于 docker 容器内的系统范围内,并且在我执行诸如 docker run -it xyz:latest make <somedir> 之类的操作时会被考虑在内。

我正在通过调用 docker run -it xyz:latest echo $SDKTARGETSYSROOT 对此进行测试,并且我希望容器能够打印 /opt/sdk/sysroots/cortexa9hf-vfp-neon-gad-linux-gnueabi`

到目前为止我试图实现的目标:

  • 将变量添加到 /etc/environment:RUN cat /opt/sdk/environment-setup-cortexa9hf-vfp-neon-gad-linux-gnueabi | cut -d" " -f 2 >> /etc/environment
  • 将变量添加到 /etc/profile、/root/.profile 和 /root/.bashrc:RUN echo -e "# Auto source some variables\nsource /opt/sdk/environment-setup-cortexa9hf-vfp-neon-gad-linux-gnueabi" >> [...]
  • 通过ENV SDKTARGETSYSROOT /opt/sdk/sysroots/cortexa9hf-vfp-neon-gad-linux-gnueabi 在 dockerfile 中手动添加一个 var,只是为了测试行为
  • ./bin/bash -c 'source' 文件 /opt/sdk/envsetup

这些都没有导致我的预期结果。如何正确设置这些变量?

由于包含变量的文件在 docker build 的开头是未知的,并且是在容器内的 sdk 安装期间创建的,我不太喜欢通过 ENV 手动将其内容添加到 dockerfile 中的想法,即使这有效,但没有。

【问题讨论】:

    标签: shell docker environment-variables dockerfile docker-build


    【解决方案1】:

    当你运行这个命令时:

    docker run -it xyz:latest echo $SDKTARGETSYSROOT
    

    $SDKTARGETSYSROOT 由您的 local shell 扩展。在任何情况下,您都没有真正测试容器内的环境变量。这会起作用:

    docker run -it xyz:latest sh -c 'echo $SDKTARGETSYSROOT'
    

    单引号禁止本地 shell 中的变量扩展,我们需要显式调用sh -c ...,因为默认情况下 Docker 不使用 shell 执行命令。比较:

    $ docker run -it alpine echo $HOME
    /home/lars
    

    与:

    $ docker run -it alpine echo '$HOME'
    $HOME
    

    与:

    $ docker run -it alpine sh -c 'echo $HOME'
    /root
    

    否则,您的几种方法看起来是做您想做的事情的合理方法。

    【讨论】:

    • 您对缺少的引号是正确的!谢谢你。对于一般问题,我必须解决的唯一解决方案是在 Dockerfile 中定义一个 ENTRYPOINT 脚本,该脚本在每次我 run 容器时获取变量。
    猜你喜欢
    • 2019-01-09
    • 1970-01-01
    • 2016-10-28
    • 2019-12-15
    • 2019-09-11
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多