解析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-compose 环境变量 .env 文件 env_file docker stack 不支持基于文件的环境变量 envsubst envsubst.py 1. 使用行内键值对 2. ...
- 在docker镜像中加入环境变量
原文链接 前言 reference:https://vsupalov.com/docker-build-time-env-values/ 很多时候,我们需要在docker镜像中加入环境变量,本人了解的 ...
- Docker Compose 引用环境变量
在项目中,往往需要在 docker-compose.yml 文件中使用环境变量来控制不同的条件和使用场景.本文集中介绍 docker compose 引用环境变量的方式.说明:本文的演示环境为 ubu ...
- Xcode 8:在 Active Compilation Conditions 中自定义环境变量
来源:没故事的卓同学 链接:http://www.jianshu.com/p/96b36360bb2d 在Xcode 7我们在 OTHER_SWIFT_FLAGS中配置环境变量.但是有一个不爽的地方就 ...
- bootargs中的环境变量说明和一些常用的uboot命令
bootargs中的环境变量说明和一些常用的uboot命令 一些常见的uboot命令:Help [command]在屏幕上打印命令的说明Boom [addr]启动在内存储器的内核Tftpboot通过t ...
- python 程序中设置环境变量
python 中调用系统命令有三种方法: 1.os.system('command') ,这个方法是直接调用标准C的system() 函数,仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 ...
- 关于Lumen / Laravel .env 文件中的环境变量是如何生效的
.env 文件包含默认环境变量,我们还可自定义其他任何有效的变量,并可通过 调用 env() 或 $_SERVER 或 $_ENV 来获取该变量.那么env()是如何加载到这些变量的呢?在Lume ...
- 怎样在Ubuntu中设置环境变量
首先启动终端. 单击屏幕左上角的Ubuntu图标,在弹出的窗口中点击搜索栏,输入"terminal", 稍等片刻,终端就会赫然在目!二话不说,直接点击! 然后打开环境设置文 ...
- 在PHP中管理环境变量
在PHP中管理环境变量 现在我们都能用很多个编程语言开发,当我开始熟悉PHP时,我会忽略其它语言的特点.我用过其他语言(比如Node.js),但在PHP中没有看到一种轻松控制设置环境变量的方法,特别是 ...
随机推荐
- 使用ajax分页查询
controller: /** * 查询所有用户/查找指定用户 * 分页+搜索 * */@RequestMapping("/findClientBySize")@ResponseB ...
- python基础知识巩固(os.walk)
python 3 os.walk语法 os.walk() 方法用于通过在目录树种游走输出在目录中的文件名,向上或者向下 os.walk(top,[, topdown=True],[, onerror= ...
- 用node在本机搭建一个极其简单的服务器
首先安装node, 建一个文件夹server, 在里面创建一个server.js,内容如下: var http = require("http"); http.createServ ...
- 【托业】【怪兽】TEST04
❤ admit doing sth 承认做某事 ❤revelation n.揭露,揭示 ❤dazzling adj. 炫目的 ❤intentionally adv.刻意地 ❤metropolitan ...
- openpyxl.utils.exceptions.IllegalCharacterError
如果是手动调用 xlwt 这种第三方库除了错可能没法找错误,但是从错误中我们看到错误是由 openpyxl 抛出的,我们试着从 openpyxl 中找解决方案 出错处的代码 value = value ...
- iOS MJExtension的使用
前言: MJExtension是iOS的字典装模型的一个第三方框架.相对于JSONKit和SBJson相比MJExtension更简单易用.功能更强大. 安装: 使用CocoaPods导入(Cocoa ...
- [LeetCode] 45. Jump Game II_ Hard tag: Dynamic Programming
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- mysql-5.7.25 源码 安装
mysql-5.7.25 源码 安装 编译 export INSTALL_PREFIX="/data/services" export MYSQL_INSTALL_PATH=&qu ...
- U盘安装Windows原版系统(安装方式有很多,我讲我的安装方式)
我陈某人,也是安装过至少200部台式或笔记本的人物. 低调,低调,开个玩笑~ 安装方式有很多,我讲我的安装方式,欢迎收藏. 1.下载准备文件下载.iso原版系统镜像文件http://msdn.itel ...
- goldsun取经----python2与 python3的差异
python2与 python3的差异 1.编码方式 python2中有ASCII str()类型,unicode是单独的,不是byte类型,不支持中文 python3中有Unicode(utf-8) ...