Docker-让我的应用程序使用secret而不是env.vars



我的Django应用程序使用了很多环境变量,总共大约35个。目前,所有这些都是由一个.env文件传递的,我在启动应用程序堆栈之前会从中获取该文件。我想我不必指出,到目前为止,这是一种非常不安全的方式,尤其是如果它是关于生产中的密钥。。。

现在我的问题是,我真的不知道如何从.env文件切换到机密,因为我不知道如何处理容器中的机密。例如,Django使用一个连接字符串来连接我的MySQL数据库,如下所示:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
'NAME': env.str('MYSQL_DB'),
'USER': env.str('MYSQL_USER'),
'PASSWORD': env.str('MYSQL_PWD'),
'HOST': env.str('MYSQL_HOST'),
'PORT': env.str('MYSQL_PORT'),
}
}

大多数时候我使用";env.str";以获取我的vars,我在开始时将其传递到容器。那么,我如何让我的Django应用程序使用docker机密,如果可能的话,按照上面显示的方式获取vars呢?有可能在我的docker-entrypoint.sh启动时加载所有需要的变量吗?如果有,如何实现?

我已经找到了这个解决方案:

if [ -f /run/secrets/MYSQL_PWD ]; then
export MYSQL_PWD=$(< /run/secrets/MYSQL_PWD)
fi
if [ -f /run/secrets/MYSQL_USER ]; then
export MYSQL_USER=$(< /run/secrets/MYSQL_USER)
fi

在启动时触发以将我的env-var设置到位,这有意义吗?请参阅:https://github.com/grafana/grafana-docker/issues/149

感谢阅读

一个选项是用文件创建一个秘密,然后使用源命令一次加载所有环境变量。

docker secret create mysecret <path_to_your_env_file>
source /run/secrets/mysecret  // in your entrypoint.sh

最新更新