我需要为 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 文件传递参数中