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"]
答案 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缓存,事情将更快。