Visual Studio Dockerfile入口点覆盖已解释?

Visual Studio Dockerfile入口点覆盖已解释?,docker,asp.net-core,.net-core,dockerfile,Docker,Asp.net Core,.net Core,Dockerfile,我是Docker的新手,正在努力理解,但我注意到Visual Studio在幕后发挥了很多“魔力”。在调试支持docker的ASP.NET核心应用程序时,除了一个应用程序外,我已经设法解决了有关docker运行命令与使用docker运行命令的所有问题 docker run -dt -v "C:\Users\jnhaf\vsdbg\vs2017u5:/remote_debugger:rw" -v "D:\ProtoTypes\WebAppDockerOrNot\WebAppDockerOrN

我是Docker的新手,正在努力理解,但我注意到Visual Studio在幕后发挥了很多“魔力”。在调试支持docker的ASP.NET核心应用程序时,除了一个应用程序外,我已经设法解决了有关docker运行命令与使用docker运行命令的所有问题

docker run 
-dt 
-v "C:\Users\jnhaf\vsdbg\vs2017u5:/remote_debugger:rw" 
-v "D:\ProtoTypes\WebAppDockerOrNot\WebAppDockerOrNot:/app" 
-v "C:\Users\jnhaf\AppData\Roaming\ASP.NET\Https:/root/.aspnet/https:ro" 
-v "C:\Users\jnhaf\AppData\Roaming\Microsoft\UserSecrets:/root/.microsoft/usersecrets:ro" 
-v "C:\Users\jnhaf\.nuget\packages\:/root/.nuget/fallbackpackages2" 
-v "C:\Program Files\dotnet\sdk\NuGetFallbackFolder:/root/.nuget/fallbackpackages" 
-e "DOTNET_USE_POLLING_FILE_WATCHER=1" 
-e "ASPNETCORE_ENVIRONMENT=Development" 
-e "ASPNETCORE_URLS=https://+:443;http://+:80" 
-e "ASPNETCORE_HTTPS_PORT=44328" 
-e "NUGET_PACKAGES=/root/.nuget/fallbackpackages2" 
-e "NUGET_FALLBACK_PACKAGES=/root/.nuget/fallbackpackages;/root/.nuget/fallbackpackages2" 
-p 4800:80 
-p 44328:443 
--entrypoint tail webappdockerornot:dev -f /dev/null

最后一个参数--entrypointtail-webappdockernot:dev-f/dev/null让我感到困惑。我知道VS正在覆盖Dockerfile中的入口点设置,但我不了解也无法在线找到的是
tail webappdockernot:dev
-f/dev/null
。我发现,
webappdockernot:dev
是docker图像,但是有人能解释这个参数是如何工作的,或者提供一个链接来解释它。

我们可以将该命令行分解为

docker run \
  ... some other arguments ... \
  --entrypoint tail \
  webappdockerornot:dev \
  -f /dev/null
并将其与一般形式相匹配

docker run [OPTIONS] [IMAGENAME:TAG] [CMD]
因此,
--entrypoint tail
选项将入口点设置为
tail
,并且“命令”部分是
-f/dev/null
。当Docker实际启动容器时,它会将命令作为附加参数传递给入口点。归根结底,这样做的净效果是

忽略Dockerfile说要做的事情;设置容器运行时环境后,改为运行
tail-f/dev/null


这是启动一个容器的常用方法,该容器不做任何事情,但也保持运行。然后,您可以使用
docker exec
和类似的面向调试的工具在容器内执行操作。

谢谢您提供的信息,但我仍然不知道
tail
是什么,以及命令参数-f(代表tail)的作用。你能提供关于这一点的见解吗?是的。让Microsoft来解决这个问题,让它变得更加混乱,但如果我读对了,它是在复制docker映像的最后部分(假定这是docker文件本身的入口点)然后将其放入新创建的docker run命令中。关于这一点我不理解:“启动一个不做任何事情的容器的常用方法”。为什么这个容器不起作用?它肯定在运行一个dotnet应用程序?因此,如果容器的
dotnet
clientrypoint被替换为
tail
,那么实际启动dotnet应用程序的是什么?它读取
/dev/null
中的所有内容,并将其打印到stdout
/dev/null
永远不会准备好读取,因此容器的主要过程实际上是“坐着不做任何事情”。没有.net应用程序,您已将其替换为
tail-f
调用。