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

How to set system-wide environment variables in dockerfile from a file inside the docker container?

我正在将交叉编译环境设置为 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>[= 之类的操作时会被考虑在内25=]

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

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

这些都没有达到我的预期结果。我怎样才能正确设置这些变量?

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

当你运行这个命令时:

docker run -it xyz:latest echo $SDKTARGETSYSROOT

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

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

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

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

有:

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

有:

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

否则,您的一些方法看起来像是一种合理的方法来完成您想要的事情。