一、问题描述

最近使用docker时,在docker中安装了Oracle Client,在root用户下将ORACLE_HOME等环境变量配置到了/etc/profile中,当时通过source /etc/profile命令使该文件生效,echo $ORCLE_HOME时也没有问题,但是重启容器以后就又不生效了。最近找到了解决方法,就是在/root/.bashrc文件中添加一句source /etc/profile(或者将环境变量的配置放到该文件中),就可以了。一直不明白原理,查阅了一下,稍微明白了,在这里总结下。

二、Linux下各种profile文件和bashrc文件的总结

1./etc/profile 
用来设置系统环境参数,比如$PATH. 这里面的环境变量是对系统内所有用户生效的。
2./etc/bashrc 
这个文件设置系统bash shell相关的东西,对系统内所有用户生效。只要用户运行bash命令,那么这里面的东西就在起作用。
3.~/.bash_profile 
用来设置一些环境变量,功能和/etc/profile 类似,但是这个是针对用户来设定的,也就是说,你在/home/user1/.bash_profile 中设定了环境变量,那么这个环境变量只针对 user1 这个用户生效.
4.~/.bashrc 
作用类似于/etc/bashrc, 只是针对用户自己而言,不对其他用户生效。  
另外/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是”父子”关系。

  • 最终要的是下面这一句:
~/.bash_profile 是交互式、login 方式进入 bash 运行的,意思是只有用户登录时才会生效。 
~/.bashrc 是交互式 non-login 方式进入 bash 运行的,用户不一定登录,只要以该用户身份运行命令行就会读取该文件。 

按照上面的观点,启动docker时后应该是非交互方式进入bash,因此就不会读取profile文件,要从~/.bashrc文件下才能加载。

三、关于这个问题的其他解决方法

正对docker的环境变量问题还可以通过,docker run 的-e参数,还有在dockerfile中这设置环境变量来解决

参考:

Linux下profile和bashrc区别/CSDN/来自外星的一只猿
使用docker exec进入容器,无法读取环境变量问题

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐