为什么Docker Compose的command字段设置的环境变量无法通过printenv查看?
现象成因解释
- 进程环境变量隔离:环境变量是Linux系统进程的私有属性,仅在进程本身及其创建的子进程范围内生效,无父子关系的独立进程之间环境变量完全隔离。你在
command字段中定义的脚本运行在容器的1号进程对应shell中,而执行docker exec进入容器时,系统会创建全新的独立shell进程,两个进程没有继承关系,自然无法读取到对方的变量。 - 变量未导出为环境变量:你在脚本中直接使用
SUM=$$(aws s3 ls | wc -l)的赋值方式,仅定义了当前shell的局部普通变量,没有添加export指令将其提升为环境变量,哪怕是当前shell启动的子进程也无法访问该变量,更不用说其他独立进程。 - 变量仅存在于脚本运行的shell上下文:你在脚本中完成SUM赋值后,最后执行的是
tail -F anything命令,此时运行脚本的shell进程处于等待tail退出的休眠状态,SUM变量仅存储在该shell的运行内存中,不会被同步到系统全局环境或其他shell的初始化配置里。
如果需要让所有进入容器的会话都能访问该变量,可以在脚本中把赋值语句修改为export SUM=$$(aws s3 ls | wc -l),再追加一行echo "export SUM=$SUM" >> /root/.bashrc,将变量写入root用户的登录初始化脚本中,后续exec进入容器的shell会自动加载该变量。
内容的提问来源于stack exchange,提问作者Hamdy
相关产品推荐
相关产品推荐

