【问题标题】:Visual Studio Dockerfile EntryPoint Override Explained?Visual Studio Dockerfile 入口点覆盖解释?
【发布时间】:2018-09-09 18:51:43
【问题描述】:

我是 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 映像,但有人可以解释这个参数是如何工作的,或者提供一个链接来解释它。

【问题讨论】:

    标签: docker asp.net-core .net-core dockerfile


    【解决方案1】:

    我们可以稍微不同地分解那个命令行

    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(用于尾)的作用。你能提供洞察力吗?
    • 把它留给微软,让它变得更加混乱,但如果我没看错的话,它正在复制 docker 图像的最后部分(假设这是 Dockerfile 的入口点本身),然后将其放入新创建的 docker run 命令中。
    • 对此我不明白的是:“启动不做任何事情的容器的常用方法”。为什么这个容器不做任何事情?当然它正在运行一个 dotnet 应用程序?因此,如果容器的 dotnet CLI 入口点被替换为 tail,那么实际启动 dotnet 应用程序的原因是什么?
    • 它从/dev/null 读取所有内容并将其打印到标准输出。 /dev/null 从未准备好阅读,因此容器的主要过程实际上是“坐着什么也不做”。没有 .net 应用程序,您已将其替换为 tail -f 调用。
    猜你喜欢
    • 2023-03-13
    • 2020-06-07
    • 2020-03-13
    • 2017-11-14
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2012-10-17
    • 2016-08-19
    相关资源
    最近更新 更多