#c# #.net #docker #mailkit
#c# #.net #docker #mailkit
Вопрос:
Во-первых, для некоторого контекста: я использую .NETCore для разработки API с идентификатором. Все находится на облачном сервере, внутри Docker. При создании пользователя новому пользователю отправляется электронное письмо с использованием mailkit и сервера веб-почты через Plesk (размещенный на том же компьютере). Доступ к docker осуществляется через перенаправление через Apache с использованием прокси-сервера из поддомена в порт на localhost
Все отлично работает при отладке через Rider от JetBrain, но он не может обработать электронную почту в 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 для тестирования.
Одним из моих текущих предположений может быть проблема с SSL-сертификатом, но я не думаю, что это вызовет проблемы с DNS или каким-либо внутренним сокетом.
Другое предположение заключается в том, что для Docker проблема получить имя хоста DNS, но поскольку оно работает нормально в локальном.
Редактировать: я несколько раз пытался запустить docker на Mac, и ошибка по-прежнему время от времени срабатывает, но не всегда. Хотя он всегда запускается на сервере и никогда не отправляет электронное письмо
Ответ №1:
После двух недель исследований я, наконец, наткнулся на решение для этого:
Проблема связана с сетью, это было очевидно, но речь идет именно о том, как контейнеры изолированы друг от друга. Проблема в том, что у контейнера нет исходящего соединения. Решение, которое работает внутри автономного контейнера, заключается в использовании --network host
параметра, который предоставил бы хост-сеть контейнеру. Обратите внимание, что использование этого приведет к удалению сопоставления портов из контейнера, поскольку порт 5000 контейнера теперь связан с портом 5000 хоста
Надеюсь, это решение поможет другим