如何从 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`
到目前为止我试图实现的目标:
- 将变量添加到 /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
在 docker 文件中手动添加一个变量,只是为了测试行为
.
或 /bin/bash -c 'source'
文件 /opt/sdk/envsetup
这些都没有达到我的预期结果。我怎样才能正确设置这些变量?
由于包含变量的文件在 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
否则,您的一些方法看起来像是一种合理的方法来完成您想要的事情。
我正在将交叉编译环境设置为 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`
到目前为止我试图实现的目标:
- 将变量添加到 /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
在 docker 文件中手动添加一个变量,只是为了测试行为 .
或/bin/bash -c 'source'
文件/opt/sdk/envsetup
这些都没有达到我的预期结果。我怎样才能正确设置这些变量?
由于包含变量的文件在 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
否则,您的一些方法看起来像是一种合理的方法来完成您想要的事情。