我应该在 docker 中使用用户机密还是环境变量
Posted
技术标签:
【中文标题】我应该在 docker 中使用用户机密还是环境变量【英文标题】:Should I use user-secrets or environment variables with docker 【发布时间】:2017-08-01 11:13:15 【问题描述】:使用 docker 和 asp.net core 进行开发时,我应该使用用户密码还是环境变量?我使用的是 Visual Studio 2017 在添加项目时创建的默认 docker 文件,该文件使用 microsoft/aspnetcore:1.1,我相信它是一个 linux 映像。
如何在 docker 中设置用户机密/环境变量,以便在启动时设置它们,但不包含在源代码中?
【问题讨论】:
【参考方案1】:对于开发我依赖.net 秘密管理工具:
-
使用 dotnet user-secrets 将机密存储在本地计算机上
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 示例:
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
..
..
【讨论】:
【参考方案2】:环境变量更好 - https://12factor.net/config
如果您使用 docker run
运行 docker,请使用 -e
或 --env-file
选项:
https://docs.docker.com/engine/reference/run/#env-environment-variables
如果您使用 docker-compose
运行 docker,请使用 environment
或 env_file
键:
https://docs.docker.com/compose/environment-variables/
【讨论】:
这就是我要找的。我正在使用此处描述的 .env 文件docs.docker.com/compose/environment-variables/#the-env-file,并将其添加到 .gitignore。谢谢。【参考方案3】:我决定添加另一个名为 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 文件中,这样它就不会添加到源代码管理中。用户密码和环境变量仍然可以使用。
【讨论】:
【参考方案4】:出于生产目的,您需要使用环境变量,而不是 use-secrets。通过帮助防止敏感数据存储在代码中/签入源代码控制,秘密存在仅用于安全存储:
Secret Manager 工具不会对存储的秘密进行加密,不应将其视为受信任的存储。它仅用于开发目的。键和值存储在用户配置文件目录中的 JSON 配置文件中。
作为环境变量的替代方案,您可以考虑使用“外部”键值存储,例如 Consul、Vault 等。
关于 docker 中的环境变量,SO 已经有相关的问题/答案。以How to pass environment variables to docker containers?为例。
【讨论】:
我知道如何使用 docker 命令传递环境变量,但是我该如何做,以便在 Visual Studio 中进行调试并启动 docker 映像时,它会传递环境变量? 聚会迟到了。如果您正在运行 VS 并且需要将环境变量传递给您的容器:以上是关于我应该在 docker 中使用用户机密还是环境变量的主要内容,如果未能解决你的问题,请参考以下文章
《前端运维》五k8s--4机密信息存储与统一管理服务环境变量
如何在从 docker-compose 调用的 .sh 文件中使用 .NET Core 机密
我应该使用 Vagrant 还是 Docker 来创建隔离环境? [关闭]
如何在 ECS 任务中将 rds.DatabaseCluster 机密作为环境变量传递