我的标题解释了其中的大部分内容,但我想了解为什么在Visual Studio中调试时可以访问https://localhost:32770/并获得我的API端点,但当我结束调试时,它变得不可用。
我现在正忙于花几天的时间研究Docker和Kubernetes,这让我有点困惑,我真的很想填补我知识上的空白。
容器在创建后仍在运行,那么是什么发生了变化?
我注意到这是在构建开始时运行的:
docker exec -i 0f855d9b4c801bf8c52da48e6dd02ffdf0fe7242fde22fb9a221616e4b2900f9 /bin/sh \
-c "if PID=$(pidof dotnet); then kill $PID; fi"但我看不出这会如何改变调试结束后、dockerfile运行之前以及一切结束后发生的事情。我不理解命令中的-c,但我理解引号中的脚本在容器中运行后遵循docker exec语法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"我在这里没有看到任何会改变容器运行方式的东西,根据docker build --help的说法,这个实例中的rm“在构建后删除中间容器(默认值为true)”
接下来运行dockerfile,它几乎是ASP.NET核心应用程序的默认文件,它具有
EXPOSE 80
EXPOSE 443其余的是简单的构建步骤。经过这一切之后,我似乎找不到太多关于正在发生的事情的迹象。我的猜测是它与IIS Express有关,但实际上我不知道它发生了什么,也不知道visual studios何时进行调试。当我调试为docker容器打开localhost端口时,幕后发生了什么?
编辑:我发现了一个docker run命令,可能与它有关,但也可能不是。docker run命令有“将所有暴露的端口发布到随机端口”的-P标志,但是容器永远不会停止运行,所以我应该找不到这些端口并连接到API吗?
发布于 2021-06-11 03:49:06
在调试过程中,如果您运行以下命令:
docker exec -it containerName bash -c 'pidof dotnet'您将注意到,dotnet进程正在运行,当您停止调试并再次运行它时,您将看到该进程已完成。
如果您希望在容器中启动应用程序,而无需再次运行调试器,则只需在容器内运行启动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'https://stackoverflow.com/questions/61466334
复制相似问题