如何在 docker 容器中为非交互式 shell 设置环境变量?

How to set environment variable for non-interactive shell in docker container?

我正在使用命令 docker run -e GRB_WLSACCESSID=xxxxxxx 为 Gurobi 授权设置环境变量。容器的OS是Ubuntu16.04。如果我通过 SSH 交互登录容器并通过 python 代码 os.getenv().

读取环境变量,这就可以了

但是,当我在 Pycharm 中将此容器添加为远程 SSH 解释器并沿 Pycharm 执行 python 代码时,我无法获取环境变量。

最后发现问题是docker run -e生成的环境变量只能通过交互shell读取。这可以通过执行 ssh root@x.x.x.x env 来验证,并在登录容器后交互式地执行 env。前者产出少

一种可能的解决方案是在生成容器后手动编写一些配置,例如在/etc/environment(由提供)中设置变量。

另一种可能的解决方案是在 Pycharm edit configuration.

中手动添加变量

有没有更优雅的方案? :(

终于明白relevant answers

的具体含义了

这意味着,在远程VM或容器中,创建一个名为mypython的linux脚本文件作为python包装器,内容为:

#!/bin/bash -l
/path/to/interpreter/bin/python "$@"

,其中 /path/to/interpreter/bin/python 是 python 解释器的路径。对于 conda 解释器,它可能看起来像 /root/miniconda3/envs/py37/bin/python.

脚本 mypython 应该放在与二进制文件 python 相同的路径中,即 /root/miniconda3/envs/py37/bin/mypython

然后给mypython加上执行权限:

chmod +x /root/miniconda3/envs/py37/bin/mypython

以上两步也可以通过命令替代执行:

echo '#!/bin/bash -l
/root/miniconda3/envs/py37/bin/python "$@"' > /root/miniconda3/envs/py37/bin/mypython
chmod +x /root/miniconda3/envs/py37/bin/mypython

最后,在Pycharm中添加SSH解释器,确保解释器路径为/root/miniconda3/envs/py37/bin/mypython

问题就解决了。