如何在docker容器中的文件中设置dockerfile中的系统范围的环境变量?

时间:2018-01-23 13:28:12

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

我正在设置一个交叉编译环境作为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安装期间创建,我真的不喜欢通过手动将其内容添加到dockerfile中的想法ENV,即使有效,但没有。

1 个答案:

答案 0 :(得分:6)

运行此命令时:

docker run -it xyz:latest echo $SDKTARGETSYSROOT

您的本地 shell扩展了$SDKTARGETSYSROOT。在任何情况下,您实际上都没有测试容器内的环境变量。这可行:

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

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