【问题标题】:Should I use user-secrets or environment variables with docker我应该在 docker 中使用用户机密还是环境变量
【发布时间】:2017-08-01 11:13:15
【问题描述】:

使用 docker 和 asp.net core 进行开发时,我应该使用用户密码还是环境变量?我使用的是 Visual Studio 2017 在添加项目时创建的默认 docker 文件,该文件使用 microsoft/aspnetcore:1.1,我相信它是一个 linux 映像。

如何在 docker 中设置用户机密/环境变量,以便在启动时设置它们,但不包含在源代码中?

【问题讨论】:

    标签: docker asp.net-core .net-core


    【解决方案1】:

    对于开发我依赖.net 秘密管理工具

    1. 使用 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

    1. 将带有机密的本地文件夹挂载到 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/

      【讨论】:

      【解决方案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 配置文件中。


        作为环境变量的替代方案,您可以考虑使用“外部”键值存储,例如 ConsulVault 等。


        关于 docker 中的环境变量,SO 已经有相关的问题/答案。以How to pass environment variables to docker containers?为例。

        【讨论】:

        • 我知道如何使用 docker 命令传递环境变量,但是我该如何做,以便在 Visual Studio 中进行调试并启动 docker 映像时,它会传递环境变量?
        • 聚会迟到了。如果您正在运行 VS 并且需要将环境变量传递给您的容器:
        猜你喜欢
        • 1970-01-01
        • 2020-12-17
        • 1970-01-01
        • 1970-01-01
        • 2013-05-14
        • 2016-02-20
        • 1970-01-01
        • 2019-08-16
        相关资源
        最近更新 更多