在我们的项目中,我们有一个带有Angular2客户端的ASP.NET Core项目。在Docker构建时,我们启动:
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。内置的Angular2客户端本身只有1.7Mb。
我们的应用程序没有任何特色:简单的Web API写入MongoDB并显示静态文件。
为了改善图像的大小,有没有办法排除在运行时无用的路径?例如node_modules
或任何.NET Core源?
答案 0 :(得分:2)
Dotnet可能会恢复很多,特别是如果你有多个目标平台(linux,mac,windows)。
根据应用程序的配置方式(即作为可移植的.NET Core应用程序或自包含的应用程序),它还可以为一个或多个平台和/或体系结构(x64,x86)提取整个.NET Core Framework 。主要解释here。
如果定义了"Microsoft.NETCore.App" : "1.0.0"
,没有类型平台,那么将通过nuget获取完整的框架。然后,如果您有多个运行时定义
"runtimes": {
"win10-x64": {},
"win10-x86": {},
"osx.10.10-x86": {},
"osx.10.10-x64": {}
}
它也将获得所有这些平台的本机库。但不仅在您的项目目录中,而且在项目中的~/.nuget
和npm-cache
以及node_modules
中的最终副本中还有wwwdata
。
然而,这不是docker的工作原理。您在Dockerfile
内执行的所有内容都会写入容器的虚拟文件系统!这就是你看到这个问题的原因。
您应该关注my previous comment on your other question:
在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
内容,而不包含所有其他构建文件,工件,缓存或源,并将从{{运行docker进程1}}文件夹。
您还需要更改docker文件,复制文件而不是运行容器构建期间的命令。
Scott将此Dockerfile用于his example in his blog:
bin\Debug\netcoreapp1.0\publish
这是构建docker容器的推荐方法。当您在内部运行构建命令时,所有构建和发布工件都保留在虚拟文件系统中,并且docker镜像意外地增长。