在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": {} }
它也将获得所有这些平台的本地库。 但是不仅在你的项目目录中,而且在~/.nuget
和npm-cache
除了项目中的wwwdata
外, node_modules
你的node_modules
中的最终副本。
但是,这不是docker工作的方式。 你在Dockerfile
执行的所有东西都被写入到容器的虚拟文件系统中! 这就是为什么你看到这个问题。
你应该按照我以前对你的另一个问题的评论 :
在Dockerfile 之外运行dotnet restore
, dotne build
和dotnet 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镜像意外增长。
- Docker的dotnet映像容器不允许我在更改后重build
- Microsoft.DotNet.Docker.CommandLineClientException:客户端版本1.22太旧
- Docker组合起来创build容器,但是并没有启动它
- Docker:在CLI上运行dotnet发布-o / output会导致非零的错误
- 如何运行由VS 2017产生的docker镜像
- 无法使用ASP.NET 5,Docker和Ubuntu连接到MSSQL服务器
- Mac OS X Docker基线aspnet错误:未findlibdl
- 将docker容器中的Connectionstring连接到主机中的SQL Server dblocal
- 在OSX中的Docker容器中缺lessDotnet Antiforgery DLL