复制。 。用于ASP.NET的Dockerfile中的命令

时间:2017-11-13 17:29:11

标签: asp.net docker dockerfile

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

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"]

2 个答案:

答案 0 :(得分:4)

COPY . .以递归方式将整个项目复制到构建容器中。

分离第一个副本加restore然后完整副本加build的原因是加速构建的缓存技巧,因此不需要每次都安装项目依赖项代码更改的时间。

Docker images are built in layers。 Docker将构成每个新图层的内容和指令与先前版本进行比较。如果它们与现有图层的SHA256校验和匹配,则可以跳过该图层的构建步骤。

代码更改比依赖项更改,并且通常从慢速(ish)网络获取依赖项。如果在完成依赖项后复制代码,则不会为每个其他更改破坏缓存的依赖关系层。

Node.js等效于应用内容之前的package.json

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

答案 1 :(得分:2)

Scott Hanselman对此的更多指示:https://www.hanselman.com/blog/OptimizingASPNETCoreDockerImageSizes.aspx

  

专业提示:Docker非常聪明地制作中间图像并做最少的工作,但是如果我们(作者)做正确的事情来帮助它,它也很有用。

     

例如,看看我们将.csproj复制到哪里然后执行“dotnet restore”?通常你会看到人们做“复制......”然后进行恢复。这不允许Docker检测到已更改的内容,并且您最终会在每次构建时为还原付费。

     

通过执行这两个步骤 - 复制项目,还原,复制代码,这意味着您的“dotnet restore”中间步骤将由Docker缓存,事情将更快。