构建没有依赖关系的Docker映像?

构建没有依赖关系的Docker映像?,docker,Docker,我是Docker的新手,所以我不知道这是否违背Docker应该如何工作的原则,但是否可以将Dockerfile中的依赖项标记为某种类型的“惰性加载”,这样它们就不会包含在由Docker构建的映像中 这里的具体案例是,当开发一个可能甚至小于1MB的非常小的应用程序时——例如.Net Core中的“微服务”REST-API——从Dockerfile构建的映像的大小为207MB或更多,因为这正是我的服务所依赖的.Net运行时的大小 是否可以配置一个映像,使它只包含我的代码,而不是用我的映像交付相当大的

我是Docker的新手,所以我不知道这是否违背Docker应该如何工作的原则,但是否可以将Dockerfile中的依赖项标记为某种类型的“惰性加载”,这样它们就不会包含在由Docker构建的映像中

这里的具体案例是,当开发一个可能甚至小于1MB的非常小的应用程序时——例如.Net Core中的“微服务”REST-API——从Dockerfile构建的映像的大小为207MB或更多,因为这正是我的服务所依赖的.Net运行时的大小

是否可以配置一个映像,使它只包含我的代码,而不是用我的映像交付相当大的运行时


提前谢谢

据我所知,你必须在你的应用程序中安装所有你需要的东西。与在操作系统上安装整个.net内核以运行任何最简单的.net应用程序的方式相同

另一点是,在这些207MB中,大约100Mb属于win nano服务器。至少上次我是这样看的

好的一面。最小的linux映像只有几MB。Net内核应该是跨平台的

因此,如果您想使图像变小,我建议您采用这种方法。这里有一些链接-


p、 我自己从来没有在linux上尝试过.NETCore——尽管它一直都很感兴趣。因为它应该比我快。

这是可能的,但这并不符合docker的精神。最好在构建映像时预先加载安装,这样可以避免每次应用程序启动时都在运行时进行安装。可能需要几分钟

如果您的用例真的需要它,我会将alpine linux docker映像作为基本映像进行检查。它很小。然后,当容器启动时,运行一个bash脚本

  • 安装dotnet:
  • 运行你的应用程序
  • 我在这里转述,但在精神上,这将起作用

    # This is the large dotnet image, but it is ony used to build
    FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
    
    COPY Code/. ./Code/
    # you will need to add some flags here to get it to compile to alpine
    RUN dotnet publish ./Code -c Release
    
    # This is your runtime image that is actually loaded into a container
    FROM alpine AS runtime
    # Copy compiled files from build to runtime image
    COPY --from=build [Your alpine publish directory from above] .
    
    # Add a bash script from your dev environment that will do the work
    COPY installDotnetAndStartupScript.sh .
    ENTRYPOINT ["installDotnetAndStartupScript.sh"]
    

    如果没有运行时,您的代码将如何运行?我在想,在安装映像时,Docker可能会自动安装映像所依赖的其他映像(例如,运行时),而不会让映像包含依赖项。之后安装必要依赖项的提示似乎很有趣,在这个过程中,我看到了使用apt get的不同方法。尽管如此,当你将它集成到你的build Dockerfile中时,它最终还是会出现在最终的映像中,这难道不是违背了目的吗?我实际上在寻找一种方法来最小化你想要传输的映像,最好不使用任何第三方软件。因此,我的方法是只使用我的二进制文件构建一个图像,然后通过save导出它。也许它可以与另一个docker文件结合使用,该文件同时加载运行时和我的映像以运行容器?“运行时”Dockerfile可以使用我的精简映像、复制二进制文件、加载.net运行时并调用dotnet.dll来运行我的二进制文件?这有意义吗?关于安装必要的依赖项:您在docker文件中的“RUN”命令中所做的任何操作都将进入映像,但如果您使用“ENTRYPOINT”或“CMD”命令,则在docker容器启动之前不会执行该命令。将其与另一个映像组合:是的,这是完全可能的,这听起来像是一个更干净的解决方案,你要去的,尤其是如果bash不是你的东西。只需留出大量时间调试docker inception,并在运行最外层容器时设置--privilidged=true: