我应该在 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,请使用 environmentenv_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 机密作为环境变量传递

如何在 Google App Engine 中设置环境变量/应用程序机密

Docker使环境变量不可写