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

why is my docker container ASP.NET core app not available after ending debugging in Visual Studio

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

我目前正忙着花几天时间思考 Docker 和 Kubernetes,这让我有点难过,我真的很想填补我的知识空白。

容器在创建后保持 运行ning,那么发生了什么变化?

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

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

但我看不出这会如何改变调试结束后发生的事情,这是在 docker 文件是 运行 之前以及其他所有内容。我不明白命令中的 -c,但我明白它后面的引号中的脚本是 运行 在容器中遵循 docker exec 语法 docker exec [OPTIONS] CONTAINER COMMAND [ARG...]。似乎这个脚本在创建新代码之前杀死了现有代码的构建。

这是 运行 之前 docker 文件是 运行

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"

根据 docker build --help

,我在这里没有看到任何会改变容器 运行ning 的东西,在这种情况下 'removes intermediate containers after a build (default true)' rm

下一个 docker 文件是 运行,它几乎是 ASP.NET 核心应用程序的默认文件,它有

EXPOSE 80
EXPOSE 443

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

编辑:我发现一个 docker 运行 命令可能与它有关,但也许不是。 docker 运行 命令有 -P 标志到 'Publish all exposed ports to random ports' 但容器永远不会停止 运行ning 所以我应该找不到这些端口并连接到API?

在调试过程中,如果你运行这个命令:

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

你会注意到,dotnet 进程是 运行ning,当你停止调试并再次 运行 时,你会看到,进程已经完成。

如果您想在容器中启动您的应用程序,无需再次 运行 调试器,您只需要 运行 在容器内启动 dotnet 进程。

你可以这样做,运行宁一个这样的脚本:

#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'