我需要为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
,在所有用户和进程的系统范围内执行此变量,而不是在运行环境中在构建时。
答案 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参数中