• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    docker中的环境变量使用与常见问题解决方案
    POST TIME:2021-10-16 17:37

    前言

    docker可以为容器配置环境变量。配置的途径有两种:

    使用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),可以实现同样的效果。

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

    上一篇:使用命令行检测Ubuntu版本方法
    下一篇:Tomcat使用Log4j输出catalina.out日志
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信