Dns.GetHostAddressesAsync: 资源暂时不可用

Dns.GetHostAddressesAsync: Resource temporarily unavailable

首先,对于某些上下文:我正在使用 .NetCore 开发具有身份的 API。一切都在 Docker 内的云服务器上。创建用户后,将使用 mailkit 和 webmail 服务器通过 Plesk(托管在同一 machine 上)向新用户发送一封电子邮件。 docker 是通过 Apache 的重定向访问的,使用 ProxyPass 从子域到 localhost

上的端口

通过 JetBrain 的 Rider 调试时一切正常,但它无法处理服务器上 docker 中的电子邮件。

这是堆栈:

System.Net.Internals.SocketExceptionFactory+ExtendedSocketException (00000001, 11): Resource temporarily unavailable
   at System.Net.Dns.InternalGetHostByName(String hostName)
   at System.Net.Dns.ResolveCallback(Object context)
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw(Exception source)
   at System.Net.Dns.HostResolutionEndHelper(IAsyncResult asyncResult)
   at System.Net.Dns.EndGetHostAddresses(IAsyncResult asyncResult)
   at System.Net.Dns.<>c.<GetHostAddressesAsync>b__25_1(IAsyncResult asyncResult)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)

我还没有尝试 运行 docker 在另一个 linux mac 上进行测试。 我目前的猜测之一是 SSL 证书有问题,但我认为这不会导致 DNS 或任何内部套接字出现问题。

另一个猜测是 Docker 获取 DNS 主机名的问题,但因为它在本地工作正常。

编辑:我多次尝试 运行 mac 上的 docker,错误仍然偶尔触发一次,但并非总是如此。它虽然总是在服务器上触发并且从不发送电子邮件

经过两周的研究,我终于找到了一个解决方案:

问题与网络有关,这是显而易见的,但这恰恰与容器如何相互隔离有关。问题是,容器没有出站连接。在独立容器内工作的解决方案是使用 --network host 参数,这会将主机网络暴露给容器。请注意,使用它会从容器中删除端口映射,因为容器的端口 5000 现在链接到主机的端口 5000

希望这个解决方案可以帮助到其他人