当使用带有asp.net核心的docker进行开发时,我应该使用用户机密还是环境变量?我正在使用Visual Studio 2017在添加项目时创建的默认docker文件,该文件使用microsoft / aspnetcore:1.1,我相信它是一个linux映像。
如何在docker中设置用户机密/环境变量,以便它们在启动时设置,但不包含在源代码中?
答案 0 :(得分:3)
出于生产目的,您需要使用环境变量,而不是使用秘密。通过帮助防止敏感数据存储在代码中/检查到源代码管理中,秘密存在 ONLY 以便在开发期间安全存储:
Secret Manager工具不会对存储的机密进行加密,也不应将其视为受信任存储。它仅用于开发目的。键和值存储在用户配置文件目录中的JSON配置文件中。
作为环境变量的替代方案,您可以考虑使用" external"键值存储,例如Consul,Vault等
关于docker中的环境变量,SO已经有相关的问题/答案。请参阅How to pass environment variables to docker containers?作为示例。
答案 1 :(得分:1)
我决定添加另一个名为appsettings.secrets.json的appsettings文件,而不是使用用户机密或环境变量。然后在构造函数中添加文件,就像其他appsettings文件一样:
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile("appsettings.secrets.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
请务必将appsettings.secrets.json添加到.gitignore文件中,以便它不会添加到源代码管理中。用户机密和环境变量仍然可以使用。
答案 2 :(得分:1)
环境变量更好 - https://12factor.net/config
如果您使用docker run
运行泊坞广告,请使用-e
或--env-file
选项:
https://docs.docker.com/engine/reference/run/#env-environment-variables
如果您使用docker-compose
使用environment
或env_file
密钥运行泊坞窗:
https://docs.docker.com/compose/environment-variables/
答案 3 :(得分:0)
对于开发,我依赖于 .net 秘密管理器工具:
dotnet user-secrets init
dotnet user-secrets set "Movies:ServiceApiKey" "12345"
..
见MS docs: Safe storage of app secrets in development in ASP.NET Core。
Docker 示例:
docker run ^
-e ASPNETCORE_ENVIRONMENT=Development ^
-v %APPDATA%/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro ^
company/image:latest
docker-compose 示例:
version: "3.8"
..
net_core_service:
..
environment:
# should be defined Development-env to allow loading user-secrets located on the local computer.
- ASPNETCORE_ENVIRONMENT=Development
..
volumes:
# map the dotnet user-secret folder
- $APPDATA/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
..
..