COPY。 。 命令在Dockerfile for ASP.NET

Docker的Visual Studio工具为包含COPY . . ASP.NET项目创build一个Dockerfile COPY . . COPY . . 命令如下:

 WORKDIR /src COPY *.sln ./ ... COPY . . 

从我读到的<src>参数是相对于上下文的,所以不受WORKDIR /src命令的影响。 然而, <dest>是相对于WORKDIR所以会指向/src

这个命令只是为了打包(docker-compose.yml,.dockerignore等)从根目录中引出剩余的文件? 如果是这样的话,那么为什么在RUN dotnet build...命令之前完成呢?

下面是完整的Dockerfile:

 FROM microsoft/aspnetcore:2.0 AS base WORKDIR /app EXPOSE 80 FROM microsoft/aspnetcore-build:2.0 AS build WORKDIR /src COPY *.sln ./ COPY MyProject/MyProject.csproj MyProject/ RUN dotnet restore COPY . . # The line mentioned above WORKDIR /src/MyProject RUN dotnet build -c Release -o /app FROM build AS publish RUN dotnet publish -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "MyProject.dll"] 

COPY . . COPY . . 将整个项目以recursion方式复制到构build的容器中。

将第一个副本加上restore ,然后是完整的副本加上build分离的原因是加速构build的caching技巧,所以每次代码更改时都不需要安装项目相关性。

Docker镜像是分层构build的 。 Docker将组成每个新层的内容和指令与先前的构build进行比较。 如果它们与现有图层的SHA256校验和匹配,则可以跳过该图层的构build步骤。

代码变化比依赖关系更多,而依赖关系通常是从慢速(ish)networking中获取的。 如果在完成依赖关系之后复制代码,则不会针对其他任何更改而对高速caching的依赖关系层进行压缩。

Node.js等同于应用程序内容之前的package.json

 WORKDIR /app COPY package.json /app/ RUN npm install COPY . /app/ CMD ["node", "app/index.js"] 

从Scott Hanselman上面的一些更多的指针: https : //www.hanselman.com/blog/OptimizingASPNETCoreDockerImageSizes.aspx

专业小贴士:Docker聪明地制作中间图像,并且做最less的工作,但是如果我们(作者)也做出正确的事情来帮助它,这将是非常有用的。

例如,看看我们在哪里复制.csproj,然后做一个“dotnet恢复”? 通常你会看到人们做一个“复制”。 然后做恢复。 这不允许Docker检测到发生了什么变化,您将最终支付每个BUILD的恢复费用。

通过这两个步骤 – 复制项目,恢复,复制代码,这意味着您的“dotnet恢复”中间步骤将由Dockercaching,事情将会更快。