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

解析docker中的环境变量使用和常见问题解决的更多相关文章

  1. 更优雅的配置:docker/运维/业务中的环境变量

    目录 docker-compose 环境变量 .env 文件 env_file docker stack 不支持基于文件的环境变量 envsubst envsubst.py 1. 使用行内键值对 2. ...

  2. 在docker镜像中加入环境变量

    原文链接 前言 reference:https://vsupalov.com/docker-build-time-env-values/ 很多时候,我们需要在docker镜像中加入环境变量,本人了解的 ...

  3. Docker Compose 引用环境变量

    在项目中,往往需要在 docker-compose.yml 文件中使用环境变量来控制不同的条件和使用场景.本文集中介绍 docker compose 引用环境变量的方式.说明:本文的演示环境为 ubu ...

  4. Xcode 8:在 Active Compilation Conditions 中自定义环境变量

    来源:没故事的卓同学 链接:http://www.jianshu.com/p/96b36360bb2d 在Xcode 7我们在 OTHER_SWIFT_FLAGS中配置环境变量.但是有一个不爽的地方就 ...

  5. bootargs中的环境变量说明和一些常用的uboot命令

    bootargs中的环境变量说明和一些常用的uboot命令 一些常见的uboot命令:Help [command]在屏幕上打印命令的说明Boom [addr]启动在内存储器的内核Tftpboot通过t ...

  6. python 程序中设置环境变量

    python 中调用系统命令有三种方法: 1.os.system('command') ,这个方法是直接调用标准C的system() 函数,仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 ...

  7. 关于Lumen / Laravel .env 文件中的环境变量是如何生效的

    .env 文件包含默认环境变量,我们还可自定义其他任何有效的变量,并可通过  调用 env() 或 $_SERVER 或 $_ENV  来获取该变量.那么env()是如何加载到这些变量的呢?在Lume ...

  8. 怎样在Ubuntu中设置环境变量

    首先启动终端. 单击屏幕左上角的Ubuntu图标,在弹出的窗口中点击搜索栏,输入"terminal", 稍等片刻,终端就会赫然在目!二话不说,直接点击!     然后打开环境设置文 ...

  9. 在PHP中管理环境变量

    在PHP中管理环境变量 现在我们都能用很多个编程语言开发,当我开始熟悉PHP时,我会忽略其它语言的特点.我用过其他语言(比如Node.js),但在PHP中没有看到一种轻松控制设置环境变量的方法,特别是 ...

随机推荐

  1. 在多个平台如何安装Python

    最近的一个项目,架构师米洛需要用的mqtt,服务器开发的时候,竟然用的python脚本.运行python就需要安装开发环境,好吧,百度一下就知道了大神廖雪峰.以下部分测试通过,转载记录如下. 因为Py ...

  2. Linux和Shell教程

    文档资料参考: 参考:http://www.runoob.com/linux/linux-tutorial.html 软件下载参考: centos 下载地址:https://www.centos.or ...

  3. ELK日志系统介绍

    ELK介绍 需求背景: 业务发展越来越庞大,服务器越来越多 各种访问日志.应用日志.错误日志量越来越多,导致运维人员无法很好的去管理日志 开发人员排查问题,需要到服务器上查日志,不方便 运营人员需要一 ...

  4. 《图解HTTP》读书笔记(二:各种协议与HTTP协议之间的关系)

    涉及到DNS协议.TCP协议.IP协议,话不多说,上图:

  5. selenium的

    1.简介 selenium可以认为是反反爬虫的最佳利器,它基本可以等同于真实的浏览器访问,用它可以加载到动态数据,也省去了cookie的操作,但是用这个有一个重大的效率问题.所以selenium可以用 ...

  6. Modelsimobjects空白无显示问题和ISim仿真时出现空白

    困扰朕长达一周的问题得以解决!!!!! 发生这种情况的根源是win10自带的防火墙的问题.只有关闭防火墙,再重新打开软件进行仿真就能出现正常的仿真界面. 关闭防火墙的方法为:控制面板>>系 ...

  7. 原生js 基于canvas写一个简单的前端 截图工具

    先看效果 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...

  8. 2018-2019-2 网络对抗技术 20165321 Exp2 后门原理与实践

    基础问题回答 (1)例举你能想到的一个后门进入到你系统中的可能方式? 答:网络钓鱼植入木马. (2)例举你知道的后门如何启动起来(win及linux)的方式? 答:绑定在合法软件上启动. (3)Met ...

  9. face++静态库转为动态库之二

    上一篇的时候,已经介绍了如何将carthage转为动态库.这一篇,我们是单纯的建一个动态库.还是以face++为例 查看上一篇: face++静态库转为动态库 制作动态库 1.创建一个工程MGLive ...

  10. eclipse 编码改成utf-8

    Eclipse的编码格式是系统默认 修改为utf-8,点击Apply and Close 然后项目的编码格式会统一默认utf-8 当然也可以选择other,改成GBK.