如何为Docker容器内的非交互式shell设置环境变量
更优雅的可落地方案按优先级推荐如下:
1. 镜像内置自动加载逻辑(优先级最高,一次配置永久生效)
这个方案不需要后续手动修改容器配置,也不用每个项目在Pycharm中单独配置变量,构建一次镜像后所有基于该镜像启动的容器都自动适配:
原理是docker run -e传入的所有环境变量都会存储在容器1号进程的/proc/1/environ文件中,我们只需要在SSH服务启动时把这些变量写入全局环境变量配置文件即可,所有交互/非交互shell都会自动读取。
在你的Dockerfile中加入以下逻辑即可:
# 适配Ubuntu 16.04的ssh启动逻辑,自动同步docker传入的环境变量到全局 RUN sed -i '1a export $(cat /proc/1/environ | tr "\\0" "\\n" | grep -v -E "^(HOME|TERM|PATH)") >> /etc/environment' /etc/init.d/ssh \ && chmod +x /etc/init.d/ssh
如果你的容器启动命令不是默认的service ssh start,而是直接启动sshd进程,也可以把同步环境变量的逻辑写到启动脚本的最前面。
2. 远程解释器全局配置(不需要修改容器,适合临时调试场景)
你提到的在edit configuration中加变量需要每个运行脚本单独配置,其实可以直接在远程解释器的全局配置中加一次,所有使用该解释器的项目/脚本都会自动生效:
- 打开路径:
File > Settings > Project: [你的项目名] > Python Interpreter - 点击对应远程解释器旁的齿轮图标,选择
Show All - 选中目标远程解释器,点击顶部的铅笔编辑按钮
- 在弹出的配置页中找到
Environment variables选项,统一添加Gurobi相关的授权变量后保存即可。
3. 开启SSH用户环境变量加载(适合需要灵活修改变量的场景)
如果你的变量经常需要调整,不想每次都重新构建镜像,可以修改SSH配置允许非交互shell加载用户自定义环境变量:
- 编辑容器内
/etc/ssh/sshd_config文件,找到PermitUserEnvironment配置项,取消注释并将值改为yes - 执行
service ssh restart重启SSH服务 - 把需要的变量写入
~/.ssh/environment文件,后续所有非交互SSH连接都会自动加载这些变量,你也可以写个简单的定时脚本同步/proc/1/environ中的变量到该文件,和docker run -e的传入值保持一致。
内容的提问来源于stack exchange,提问作者HANGVANE
相关产品推荐
相关产品推荐

