【问题标题】:How to set environment variable for non-interactive shell in docker container?如何在 docker 容器中为非交互式 shell 设置环境变量?
【发布时间】:2021-12-08 22:25:54
【问题描述】:

我正在使用命令docker run -e GRB_WLSACCESSID=xxxxxxx 为 Gurobi 授权设置环境变量。容器的操作系统是 Ubuntu 16.04。如果我通过 SSH 交互方式登录容器并通过 python 代码os.getenv() 读取环境变量,这是可以的。

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

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

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

另一种可能的解决方案是在 Pycharm edit configuration 中手动添加变量。

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

【问题讨论】:

    标签: python linux docker pycharm


    【解决方案1】:

    我终于明白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

    问题就解决了。

    【讨论】:

      猜你喜欢
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 2017-05-11
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 2022-08-08
      相关资源
      最近更新 更多