docker中的环境变量运用与常见题目解决方案
前言
docker可认为容器配置环境变量。配置的路径有两种:
- 在制作镜像时,通过ENV下令为镜像添加环境变量。在容器启动时运用该环境变量。
- 在容器启动时候,通过参数配置环境变量,要是与镜像中有反复的环境变量,会遮盖镜像的环境变量。
运用docker exec {containerID} env
即可查看容器中生效的环境变量。
[root@localhost ~]# docker exec 984 env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/java/default/bin TERM=xterm AUTHORIZED_KEYS=**None** JAVA_HOME=/usr/java/default HOME=/root ...
容器启动的进程,也就是ENTRYPOINT+CMD中,可以通过响应的系统库获取容器的环境变量。
进入到容器中,查看进程的环境变量,可以通过/proc下进行查看。
cat /proc/{pid}/environ
因而,容器中的环境变量也可以通过在容器中查看1号进程的环境变量来获取。可以通过施行cat /proc/1/environ |tr '\0' '\n'下令进行查看。
[root@localhost ~]# docker exec -it 984 cat /proc/1/environ |tr '\0' '\n' PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/java/default/bin TERM=xterm AUTHORIZED_KEYS=**None** JAVA_HOME=/usr/java/default HOME=/root ...
个别来说,从父进程发生出来的子进程都会默许继承父进程的环境变量。因而容器中的各个进程的环境变量应当是大致雷同的。当然,在一些特别的状况下,环境变量也会被重置,导致发生一些误会和题目。下面就对容器中一些常见的状况进行相干解说。
常见题目及解决
切换不一样会员后环境变量消散
在容器中,启动后切换不一样会员,比方运用su - admin
切换admin会员后,发明配置的容器环境变量遗失了。
这是由于切换会员会导致环境变量重置。因而要运用su -p admin
这样的方式,才可以继承先前的环境变量。
我们可以通过help来看下su的相干参数描述。
[root@adworderp-03a38d62-4103555841-m81qk /]# su --help Usage: su [OPTION]... [-] [USER [ARG]...] Change the effective user id and group id to that of USER. ... -m, --preserve-environment do not reset HOME, SHELL, USER, LOGNAME environment variables -p same as -m ...
容器中的乱码题目
一些业务在迁移到容器中时,常常汇报打印日志乱码。个别的缘由是locale没有配置准确导致。
可以通过locale查看目前容器的说话环境。要是没设置,个别会是POSIX。我们可以通过locale -a查看目前容器支撑的说话环境,而后依据需要进行设置。
要想一劳永逸,最佳的方式还是在容器启动或者镜像的环境变量中增加LANG={xxx},选中合适的说话,从而以免因而导致的乱码题目。
ssh的环境变量题目
容器中启用sshd,可以利便连贯和排障,以及进行一些日常的运维操纵。
但是许多会员进入到容器中却发明,在docker启动时候配置的环境变量通过env下令并不能够正常显示。
这个的主要缘由还是ssh为会员创立连贯的时候会导致环境变量被重置。
这样导致的最大题目就是通过ssh启动的容器进程将没法获取到容器启动时候配置的环境变量。
理解了道理后,这个题目有个简略的要领解决。就是可以通过将容器的环境变量从新设置到ssh连贯后的session中。
具体的实现方式是,ssh连贯后,会主动施行source /etc/profile。
那么我们其实只有在/etc/profile追加几行代码,从1号进程获取容器自身的环境变量,然后轮回将环境变量export一下即可。
下列是一个简略的for轮回实现。
for item in `cat /proc/1/environ |tr '\0' '\n'` do export $item done
当然,有更简约的下令,就是export $(cat /proc/1/environ |tr '\0' '\n' | xargs),可以实现一样的结果。
总结
以上就是这篇文章的全部内容了,但愿本文的内容对大家的学习或者工作拥有一定的参考学习价值,感谢大家对脚本之家的支撑。