【问题标题】:Environment Variable cannot be found in docker container在 docker 容器中找不到环境变量
【发布时间】:2019-06-26 10:39:03
【问题描述】:

我正在尝试在 Ubuntu 服务器上为不和谐机器人设置 docker 容器。

我在 Ubuntu 服务器上运行了以下命令:

export DISCORD_TOKEN = "*****"

sudo docker run --env DISCORD_TOKEN  me/my-docker-repo

在我的机器人代码中:

import os
TOKEN = os.environ['DISCORD_TOKEN']

容器运行时会出现 python 错误“KeyError: 'DISCORD_TOKEN'”

【问题讨论】:

  • 尝试将docker添加到当前用户的用户组。此后,登录到新的 bash 会话,再次设置环境变量:DISCORD_TOKEN 并在不使用 sudo 的情况下运行 docker run 命令。这应该可以解决您的问题。
  • 尝试一个 .env 文件
  • 这适用于 Divij Sehgal。它确实警告无法加载配置文件,但容器现在正在运行。谢谢!
  • @KGB33 我会将其添加为答案,以便您可以将其标记为已关闭。

标签: python-3.x docker environment-variables ubuntu-server


【解决方案1】:

回答原始问题(来自我上面的评论):

尝试将 docker 添加到当前用户的用户组。此后,登录到一个新的 bash 会话,再次设置环境变量:DISCORD_TOKEN(和任何其他变量)并运行不带sudo 的命令,如下所示:

sudo docker run --env DISCORD_TOKEN  me/my-docker-repo

这应该可以解决您的问题。

原因

发生这种情况是因为当您以 sudo 前缀启动容器时,它不会在当前用户中查看,而是在 root 用户的环境变量定义中查看。所以没有sudo前缀,它会在当前用户的环境变量定义中查找。


关于config file 的加载失败的另一个问题,这可能会有所帮助: Docker can’t load config file, but container works fine

【讨论】:

    【解决方案2】:

    sudo 默认情况下将 shell 环境变量重置为最小的“已知安全”变量集。如果您使用sudo -E 选项,它将保留环境变量

    sudo -E docker run --env DISCORD_TOKEN  me/my-docker-repo
    

    你也可以直接在命令行传递容器端的环境变量,不用在父shell中这样设置

    sudo docker run --env DISCORD_TOKEN="*****" me/my-docker-repo
    

    【讨论】:

      【解决方案3】:

      试试这个,

      TOKEN = os.environ.get('DISCORD_TOKEN')
      

      或者,

      TOKEN = os.getenv('DISCORD_TOKEN')
      

      如果你想在 python 中设置环境试试这个,

      os.environ["Key"] = Value
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-16
        • 2016-05-30
        • 1970-01-01
        • 1970-01-01
        • 2016-03-07
        • 2017-12-26
        • 1970-01-01
        相关资源
        最近更新 更多