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

时间:2019-06-06 19:32:54

标签: 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

没有帮助。

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

2 个答案:

答案 0 :(得分:1)

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

#!/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

答案 1 :(得分:0)

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

在ENTRYPOINT中的docker file pass参数中