解析docker中的环境变量使用和常见问题解决
解析docker中的环境变量使⽤和常见问题解决
docker容器中的环境变量
docker可以为容器配置环境变量。配置的途径有两种:
1. 在制作镜像时,通过ENV命令为镜像增加环境变量。在容器启动时使⽤该环境变量。
2. 在容器启动时候,通过参数配置环境变量,如果与镜像中有重复的环境变量,会覆盖镜像的环境变量。
使⽤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),可以实现同样的效果。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。