我是Docker的新手并试图理解,但我注意到Visual Studio在幕后做了很多“魔术”。我已经设法找出我在调试具有Docker支持的ASP.NET Core应用程序时使用的docker run命令的所有问题。
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
最后一个论点--entrypoint tail webappdockerornot:dev -f /dev/null
让我感到困惑。我知道VS覆盖了Dockerfile中的入口点设置,但我不明白也无法在网上找到tail webappdockerornot:dev
和-f /dev/null
。我发现webappdockerornot:dev
是码头图像,但有人可以解释这个论点是如何工作的,或者提供一个解释它的东西的链接。
我们可以稍微改变一下命令行
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
和类似的面向调试的工具来处理容器内部的事情。