Я запускаю службу DotNet в контейнере Docker centos:7
, и у меня возникают проблемы с кодом, который мне дали работать по-другому в ситуации dotnet publish
против dotnet run
.
В настоящее время у меня запущена служба dotnet, которая прослушивает порт 3480
.Похоже, что код dotnet, который я использую, также пытается создать экземпляр TcpListener
на том же порту.
В режиме dotnet run
он появляется , чтобы это произошло, как в публикацииЯ получаю ошибку address in use
.
Поэтому, прежде чем запустить свой код, у меня есть net stat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3840 0.0.0.0:* LISTEN 5017/dotnet
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN -
, где pid 5017 , моя служба прослушиваетTCP-порт
После запуска мой код выглядит следующим образом:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 1 0 0.0.0.0:3840 0.0.0.0:* LISTEN 5247/dotnet
tcp 0 0 172.17.0.2:4000 0.0.0.0:* LISTEN 5247/dotnet
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN -
PID 5247 , кажется, вступил во владение ??
Затемкогда я завершаю код, мы возвращаемся в это состояние:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3840 0.0.0.0:* LISTEN 5017/dotnet
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN -
Единственное отличие, которое я могу придумать, это когда я ps -eo pid, command
получаю следующее:
5017 /usr/bin/dotnet /usr/share/my-agent/My.Agent.Linux.dll
5247 dotnet exec /devel/SandBox/bin/Debug/netcoreapp2.0/ServerSandbox.dll
Если я запускаю опубликованную версию dotnet publish -o publish -r linux-x64 -c Debug
, я получаю это:
5017 /usr/bin/dotnet /usr/share/my-agent/My.Agent.Linux.dll
8405 ./publish/My.ServerSandbox
И, когда код выходит из строя, управляющий порт PID
4080
остается прежним.
Мой хотя бы процесс заключается в том, что DotNet Runtime
каким-то образом фактически управляет самими портами - именно поэтому он позволяет открыть один и тот же порт дважды, тогда как при публикации моего кода я используювстроенная среда выполнения и, таким образом, мы попадаемся на то, что не должно происходить.
Кто-нибудь видел такое поведение раньше?Я бегал кругами по поводу того, почему я не смог заставить опубликованную версию работать, и после копания я считаю, что ее версия запуска не должна работать.
Спасибо за любой совет/ помощь, которую вы можете предложить.