【问题标题】:Can not call external URLs from docker compose无法从 docker compose 调用外部 URL
【发布时间】:2021-12-17 00:43:18
【问题描述】:

对于本地开发,使用 docker compose,一切正常,但几天前尝试验证用户身份时开始出现此错误。

此处的 GUID 被替换为 {TenantId}:

System.InvalidOperationException: IDX20803: Unable to obtain configuration from: 'https://login.microsoftonline.com/{TenantId}/v2.0/.well-known/openid-configuration'.
 ---> System.IO.IOException: IDX20804: Unable to retrieve document from: 'https://login.microsoftonline.com/{TenantId}/v2.0/.well-known/openid-configuration'.
 ---> System.Net.Http.HttpRequestException: Name or service not known
 ---> System.Net.Sockets.SocketException (0xFFFDFFFF): Name or service not known
   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean allowHttp2, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
   at Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.GetDocumentAsync(String address, CancellationToken cancel)
   --- End of inner exception stack trace ---
   at Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.GetDocumentAsync(String address, CancellationToken cancel)
   at Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfigurationRetriever.GetAsync(String address, IDocumentRetriever retriever, CancellationToken cancel)
   at Microsoft.IdentityModel.Protocols.ConfigurationManager`1.GetConfigurationAsync(CancellationToken cancel)
   --- End of inner exception stack trace ---
   at Microsoft.IdentityModel.Protocols.ConfigurationManager`1.GetConfigurationAsync(CancellationToken cancel)
   at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
   at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
   at Microsoft.AspNetCore.Authentication.AuthenticationHandler`1.AuthenticateAsync()
   at Microsoft.AspNetCore.Authentication.AuthenticationService.AuthenticateAsync(HttpContext context, String scheme)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

我创建了一个单独的应用程序只是为了调用这个 url,并注意到它只在 docker-compose 中运行时会出错,如果作为单个 docker 容器运行它运行没有问题。这似乎是一个 docker-compose 问题,因为它有时会工作几分钟,然后再次开始显示错误。在单独的新安装的笔记本电脑上进行了尝试,得到了相同的结果。

使用 docker-compose 版本 1.29.2,构建 5becea4c

是否有任何已知问题、解决方案或解决方法?

更新:

docker-compose.yml:

version: '3.4'

services:
  webapplication1:
    image: ${DOCKER_REGISTRY-}webapplication1
    build:
      context: .
      dockerfile: WebApplication1/Dockerfile

docker-compose.override.yml:

version: '3.4'

services:
  webapplication1:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
    ports:
      - "80"
      - "443"
    volumes:
      - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
      - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro

startup.cs:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddMicrosoftIdentityWebApi(Configuration, "AzureAd");

【问题讨论】:

  • 它不太可能不能在 compose 中工作,但可以正常 docker run,因为 compose 只是一个包装器。它基本上导致 docker 引擎在一天结束时执行相同的操作。但是,如果您真的认为它与 compose 相关,最好显示您的 compose 文件和运行非 compose docker 映像的命令,以便我们发现任何差异或问题。
  • 53 端口是否开放? “名称或服务未知”似乎无法进行 DNS 查找
  • 我怀疑这个问题迟早会出现在常规的 docker 运行中。正如您所说,有时它可以工作,有时不能与 compose 一起使用。这似乎是您正在点击的端点的问题。或者你没有正确传递tenantId。
  • 您可以编辑您的问题并在其中包含文件以及任何其他可能相关的信息。

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


【解决方案1】:

我最近遇到了这个问题并找到了几个解决方案...我在 Docker for Windows 中本地运行一个应用程序。它在 IDE 中运行良好,但在尝试使用 Azure AD 进行身份验证时在 Docker Compose 中运行时抛出此错误。问题的根源在于 docker compose 中的 DNS 系统无法解析 login.microsoftonline.com。其他 URL 工作正常,但这个 URL 有一些不同。

最初的解决方案是使用外部 DNS 服务器(谷歌 DNS)在 compose 文件中配置您的服务,如下所示:

dns:
  # specifying DNS servers here, as the container seems to have trouble resolving the URL for the Azure AD login site
  - 8.8.8.8
  - 8.8.4.4

这对我产生了副作用......对于我的特定设置,我的应用程序容器需​​要访问在 Docker compose 设置之外运行的数据库。我的连接字符串指向gateway.docker.internal(我的本地物理机的地址)。使用上面的外部 DNS 服务器使这个内部 Docker 引用停止工作。我最终发现解决这个问题的方法是完全删除 dns: 部分并将其替换为 dns_search 条目,以告诉 Docker 通过 DNS 查找哪些 URL:

dns_search:
  - login.microsoftonline.com

dns_search 设置没有很好的记录,但似乎对我有用。它解决了我的 .Net 应用程序无法连接到 Azure AD 的问题,并且没有将我的连接字符串中断到 gateway.docker.internal

编辑:上述项目似乎没有始终如一的帮助,所以我添加了这个条目来为登录站点创建一个主机文件条目:

extra_hosts:
  - "login.microsoftonline.com:40.126.29.13"

虽然 IP 地址可能会发生变化,但这确实让我工作正常,并且对于本地开发来说已经足够了。

【讨论】:

  • 抱歉,回复晚了。但是我很久以前就能够解决这个问题并且忘记提及解决方案,即将DNS添加到我的本地docker-compose文件中,就像你在回答中提到的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 2015-05-19
  • 1970-01-01
相关资源
最近更新 更多