在Docker镜像构build时排除path以提高大小

在我们的项目中,我们有一个带有Angular2客户端的ASP.NET Core项目。 在Docker构build时,我们启动:

FROM microsoft/dotnet:latest COPY . /app WORKDIR /app RUN ["dotnet", "restore"] RUN apt-get -qq update ; apt-get -qqy --no-install-recommends install \ git \ unzip RUN curl -sL https://deb.nodesource.com/setup_7.x | bash - RUN apt-get install -y nodejs build-essential RUN ["dotnet", "restore"] RUN npm install RUN npm run build:prod RUN ["dotnet", "build"] EXPOSE 5000/tcp ENV ASPNETCORE_URLS http://*:5000 ENTRYPOINT ["dotnet", "run"] 

由于恢复npm包是使用npm run build Angular2客户端所必需的,所以我们的Docker镜像很大,我的意思是差不多是2GB。 build立的Angular2客户端本身只有1.7Mb。

我们的应用程序没有什么奇特的:简单的Web API写入到MongoDB和显示静态文件。

为了提高图像的大小,有没有办法排除在运行时无用的path? 例如node_modules或任何.NET核心来源

Dotnet可能还原很多,特别是如果你有多个目标平台(Linux,Mac,Windows)。

根据应用程序的configuration方式(例如,作为可移植的.NET Core应用程序或自包含的应用程序),它也可以为整个.NET Core Framework提供一个或多个平台和/或多个体系结构(x64,x86)。 这主要在这里解释。

当定义"Microsoft.NETCore.App" : "1.0.0" ,如果没有types平台,那么将通过nuget获取完整的框架。 那么如果你有多个运行时间定义

  "runtimes": { "win10-x64": {}, "win10-x86": {}, "osx.10.10-x86": {}, "osx.10.10-x64": {} } 

它也将获得所有这些平台的本地库。 但是不仅在你的项目目录中,而且在~/.nugetnpm-cache除了项目中的wwwdata外, node_modules你的node_modules中的最终副本。

但是,这不是docker工作的方式。 你在Dockerfile执行的所有东西都被写入到容器的虚拟文件系统中! 这就是为什么你看到这个问题。

你应该按照我以前对你的另一个问题的评论 :

在Dockerfile 之外运行dotnet restoredotne builddotnet publish ,例如在bash或powershell / batch脚本中。

完成调用后,将容器中的发布文件夹的内容复制到

 dotnet publish docker build bin\Debug\netcoreapp1.0\publish ... (your other parameters here) 

这将在您的文件系统上生成发布文件,只包含所需的dll文件,视图和wwwroot内容,而不包含所有其他构build文件,工件,caching或源代码,并将从bin\Debug\netcoreapp1.0\publish运行bin\Debug\netcoreapp1.0\publish进程夹。

您还需要更改您的泊坞窗文件,以复制这些文件,而不是运行您在容器构build期间所拥有的命令。

Scott 在他的博客中使用这个Dockerfile作为例子 :

 FROM ... # Your base image here ENTRYPOINT ["dotnet", "YourWebAppName.dll"] # Application to run ARG source=. # An argument from outside, here store the path from real filesystem WORKDIR /app ENV ASPNETCORE_URLS http://+:82 # Define the port it should listen EXPOSE 82 COPY $source . # copy the files from defined folder, here bin\Debug\netcoreapp1.0\publish to inside the docker container 

这是build立docker集装箱的推荐方法。 在内部运行构build命令时,所有构build和发布构件都将保留在虚拟文件系统中,并且Docker镜像意外增长。