docker中的环境变量使用与常见问题解决方案

2020-06-17 07:01:36易采站长站整理

前言

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 ‘’ ‘n’命令进行查看。


[root@localhost ~]# docker exec -it 984 cat /proc/1/environ |tr '' '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查看当前容器支持的语言环境,而后根据需要进行设置。