在Docker镜像构建时排除路径以改善大小

时间:2017-01-13 12:40:59

标签: docker asp.net-core

在我们的项目中,我们有一个带有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源

1 个答案:

答案 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": {}
 }

它也将获得所有这些平台的本机库。但不仅在您的项目目录中,而且在项目中的~/.nugetnpm-cache以及node_modules中的最终副本中还有wwwdata

然而,这不是docker的工作原理。您在Dockerfile 内执行的所有内容都会写入容器的虚拟文件系统!这就是你看到这个问题的原因。

您应该关注my previous comment on your other question

在Dockerfile中运行dotnet restoredotne builddotnet 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镜像意外地增长。