如何在容器启动时为所有用户在 docker 容器系统范围内设置环境变量



我需要为 docker 容器中的所有用户和进程设置一些环境变量。它应该在容器启动时设置,而不是在Dockerfile中设置,因为它取决于运行环境。

所以简单的Dockerfile

FROM ubuntu
RUN echo 'export TEST=test' >> '/root/.bashrc'

适用于交互式会话 docker run -ti test bash然后 env还有TEST=test

但是当docker run -ti test env时,就没有TEST

我在努力

RUN echo 'export TEST=test' >> '/etc/environment'
RUN echo 'TEST="test"' >> '/etc/environment'
RUN echo 'export TEST=test' >> /etc/profile.d/1.sh
ENTRYPOINT export TEST=test

无济于事。

为什么我需要这个。我在容器内有http_proxy由 docker 自动设置的变量,我需要基于它设置另一个变量,即 JAVA_OPT ,在系统范围内,针对所有用户和进程,在运行环境中执行,而不是在构建时

我将创建一个脚本,该脚本将作为入口点:

#!/bin/bash
# if env variable is not set, set it
if [ -z $VAR ];
then
    # env variable is not set
    export VAR=$(a command that gives the var value);
fi
# pass the arguments received by the entrypoint.sh
# to /bin/bash with command (-c) option
/bin/bash -c $@ 

在 Dockerfile 中,我会设置入口点:

ENTRYPOINT entrypoint.sh

现在每次我运行docker run -it <image> <any command>它都使用我的脚本作为入口点,因此将始终在命令之前运行它,然后将参数传递到正确的位置,即/bin/bash

改进

如果您始终使用带有参数的入口点,则上述脚本足以工作,否则您的$@变量将为空,并会给您一个错误/bin/bash: -c: option requires an argument。一个简单的解决方法是 if 语句:

if [ ! -z $@ ];
then
    /bin/bash -c $@;
fi

在 ENTRYPOINT 中设置参数可以解决此问题。

在入口点中的 docker 文件传递参数中

最新更新