为什么在 Visual Studio 中结束调试后我的 docker 容器 ASP.NET Core 应用程序不可用

2024-02-23

我的标题解释了大部分内容,但想了解为什么我可以访问https://本地主机:32770/ https://localhost:32770/当我在 Visual Studio 中调试时获取我的 API 端点,但当我结束调试时它变得不可用。

我目前正在花几天时间研究 Docker 和 Kubernetes,这有点难倒我,我真的很想填补我的知识空白。

容器在创建后仍然保持运行状态,那么发生了什么变化呢?

我注意到这是在构建开始时运行的:

docker exec -i 0f855d9b4c801bf8c52da48e6dd02ffdf0fe7242fde22fb9a221616e4b2900f9 /bin/sh \
-c "if PID=$(pidof dotnet); then kill $PID; fi"

但我不明白这会如何改变调试结束后发生的情况,而此时是在 dockerfile 运行之前以及所有内容之前。我不明白命令中的 -c,但我确实明白引号中的脚本在以下容器中运行后docker exec syntax docker exec [OPTIONS] CONTAINER COMMAND [ARG...]。看来这个脚本在创建新代码之前会杀死现有的代码构建。

这是在 dockerfile 运行之前运行的

docker build -f "F:\Dev\API_files\API_name\Dockerfile" 
--force-rm 
-t API_name:dev 
--target base  
--label "com.microsoft.created-by=visual-studio" 
--label "com.microsoft.visual-studio.project-name=API_name" "F:\Dev\API_name"

我在这里没有看到任何会改变容器运行方式的内容,在本例中 rm '在构建后删除中间容器(默认为 true)' 根据docker build --help

接下来运行 dockerfile,它几乎是 ASP.NET core 应用程序的默认文件,它具有

EXPOSE 80
EXPOSE 443

其余的都是简单的构建步骤。 毕竟,我似乎找不到太多关于正在发生的事情的迹象。我的猜测是它与 IIS Express 有关,但实际上我不太了解它发生了什么以及 Visual Studio 何时进行调试。当我调试以打开 docker 容器的本地主机端口时,幕后运行的情况是什么?

编辑:我发现一个 docker run 命令可能与它有关,但也可能没有。 docker run 命令有-P标记为“将所有公开的端口发布到随机端口”,但容器永远不会停止运行,所以我是否应该无法找到这些端口并连接到 API?


调试过程中,如果执行以下命令:

docker exec -it containerName bash -c 'pidof dotnet'

您会注意到,dotnet 进程正在运行,当您停止调试并再次运行它时,您将看到该进程已完成。

如果你想在容器中启动你的应用程序,而不需要再次运行调试器,你只需要运行startdotnet容器内的进程。

您可以通过运行如下脚本来做到这一点:

#Set these 3 variables
$containerName = "MyContainer"
$appDll = "myApp.dll"
$appDirectory = "/app/bin/debug/netcoreapp3.1"

$args = "/c docker exec -it $containerName bash -c 'cd $appDirectory;dotnet $appDll'"
Start-Process -FilePath "powershell" -ArgumentList $args -NoNewWindow

您可以通过再次运行此脚本来检查它是否有效:

docker exec -it containerName bash -c 'pidof dotnet'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 Visual Studio 中结束调试后我的 docker 容器 ASP.NET Core 应用程序不可用 的相关文章

随机推荐