在Docker中的.Net Core 2.0上运行IdentityServer4 - 访问主机资源

时间:2017-11-20 23:52:43

标签: docker .net-core docker-compose identityserver4

我试图将服务(IdentityServer 4 v2)转换为.Net Core 2.0应用程序,以便在Docker for Windows上运行。这只是在开发工作站上。 我做了标准的Visual Studio 2017"添加Docker Support"到现有的Net Core 2.0服务。该服务启动正常,但由于这些问题而失败:

  1. 该服务正在寻找安装在本地主机上的证书。在docker中运行它没有看到此证书。
  2. 该服务正在使用主机etc / Hosts文件中的DNS来查找我们的数据库服务器。在Docker上运行的服务没有看到主机DNS。
  3. 我尝试将docker compose中的network_mode设置为" host"但那无法建立。建立这样一个环境的建议方法是什么?

    使用docker compose设置运行时,默认的compose和配置非常简单:

    version: '3'
    
    services:
      identity.server:
        image: identity.server
        ports:
          - "8100:8100"
        build:
          context: ./src/Identity.Server
          dockerfile: Dockerfile
    

    引用的dockerfile:

    FROM microsoft/dotnet:2.0-runtime
    ARG source
    WORKDIR /app
    COPY ${source:-obj/Docker/publish} .
    ENTRYPOINT ["dotnet", "Identity.Server.dll"]
    

    我已阅读以下答案,但它似乎不适用于.Net本身:https://devops.stackexchange.com/questions/1501/configure-docker-to-use-ssl-for-a-private-registry-on-windows-10?newreg=0d065d6c37214be4bd1f02a45e1248ba

    我们正在访问这样的证书,它只是返回null。如果服务在Docker之外运行,则会发现。

    var cert = X509.LocalMachine.CertificateAuthority.Thumbprint
    .Find(settings.CertificateThumbprint).FirstOrDefault();
    

1 个答案:

答案 0 :(得分:0)

使用docker的全部意义是将容器资源与其他容器分开并托管自身。从应用程序POV,您调用的LocalMachine不是您的主机,而是“容器”,因此一切都按预期工作。

我假设您不想将crt文件放在图像中,这是非常明智的。

要使其正常工作,请将crt文件放在某个文件夹中,然后使用docker volume将该dir挂载到容器中,或者如果在swarm中使用docker,请使用docker secrets。