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

 更新时间:2019年03月15日 08:35:04   作者:xinkun  
这篇文章主要给大家介绍了关于docker中环境变量使用与常见问题解决方案的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用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),可以实现同样的效果。

总结

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

相关文章

  • 如何修改 docker 容器的启动参数

    如何修改 docker 容器的启动参数

    工作中我们经常遇到docker容器运行一段时间后,因为各种原因需要调整启动参数的情况,这篇文章主要介绍了如何修改 docker 容器的启动参数,需要的朋友可以参考下
    2023-09-09
  • docker中如何将jar包构建成镜像并执行

    docker中如何将jar包构建成镜像并执行

    这篇文章主要介绍了docker中如何将jar包构建成镜像并执行问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • docker容器启动不起来的若干问题解决

    docker容器启动不起来的若干问题解决

    本文主要介绍了docker容器启动不起来的若干问题解决,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • Docker中使用Redis配置文件的详细指南

    Docker中使用Redis配置文件的详细指南

    在现代软件开发中,Redis 因其高性能和低延迟的特性,被广泛用作数据结构服务器和消息代理,Docker 作为一个轻量级的容器化平台,使得部署和管理 Redis 变得更加简单和高效,本文给大家介绍了Docker中使用Redis配置文件的详细指南,需要的朋友可以参考下
    2024-11-11
  • Docker API 未授权访问漏洞问题解析

    Docker API 未授权访问漏洞问题解析

    这篇文章主要介绍了Docker API 未授权访问漏洞问题解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • docker-compose 部署 Apollo 自定义环境的详细教程

    docker-compose 部署 Apollo 自定义环境的详细教程

    本篇文章给大家介绍docker-compose 部署 Apollo 自定义环境的详细教程,而其中Config Service提供配置的读取、推送等功能,服务对象是Apollo客户端,对docker部署Apollo环境相关知识感兴趣的朋友一起看看吧
    2021-06-06
  • Docker容器添加自定义MySQL配置文件

    Docker容器添加自定义MySQL配置文件

    本文介绍在Docker容器中通过绑定挂载为MySQL添加自定义配置文件,包括确定绑定挂载目录、创建配置文件、添加配置项、重启容器和验证配置,具有一定的参考价值,感兴趣的可以了解一下
    2024-11-11
  • Docker教程:使用容器(简单示例)

    Docker教程:使用容器(简单示例)

    今天小编就为大家分享一篇关于Docker教程:使用容器(简单示例),小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • docker将镜像打包为.tar包实现方法

    docker将镜像打包为.tar包实现方法

    使用tar包格式进行压缩,方便在不同的docker主机之间进行迁移和备份,下面这篇文章主要给大家介绍了关于docker将镜像打包为.tar包的实现方法,需要的朋友可以参考下
    2024-07-07
  • 使用Golang玩转Docker API的实践

    使用Golang玩转Docker API的实践

    这篇文章主要介绍了使用Golang玩转Docker API的实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论