Docker 容器中找不到环境变量。

4

我将在Ubuntu服务器上设置一个docker容器,用于discord机器人。

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

export DISCORD_TOKEN = "*****"

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

在bot的代码中,我有以下内容:
import os
TOKEN = os.environ['DISCORD_TOKEN']

当容器运行时,会出现Python错误"KeyError: 'DISCORD_TOKEN'"。

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

2

最初的回答:

尝试将docker添加到当前用户的用户组中。然后,登录到一个新的bash会话中,重新设置环境变量:DISCORD_TOKEN(和任何其他变量),并按以下方式运行命令,无需使用sudo:

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

这将解决你的问题。 原因 这是因为当你用sudo前缀启动容器时,它会查找root用户的环境变量定义,而不是当前用户的。所以没有sudo前缀时,会查找当前用户的环境变量定义。
另一个关于config file加载失败的问题,这可能有帮助: Docker无法加载配置文件,但容器可以正常工作

1

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接