Docker如何将缓存层关联到特定的dockerfiles?



假设我有这个docker文件在D: drive文件夹中,所以路径是D:MyProjectswebapp

FROM mcr.microsoft.com/dotnet/sdk:3.1
WORKDIR /src
COPY ["webapp/WebApplication.csproj", "webapp/"]
RUN dotnet restore "webapp/WebApplication.csproj"
COPY . .
WORKDIR "/src/webapp"
RUN dotnet build "WebApplication.csproj" -c Release -o /app/build

我知道docker使用缓存层,所以第二次构建镜像时,如果没有任何变化,那么docker将使用缓存层来加快构建时间。

但我可以有另一个文件夹/驱动器(C:Projectswebapp)也包含webapplication的相同名称(不同的源代码),那么Docker如何知道哪个是正确的缓存层使用?或者Docker记录Dockerfile的位置?如果docker这样做,那么如果我移动一个文件夹到另一个驱动程序,那么docker将失去所有的缓存层?

dockerfile的位置对于缓存策略并不重要。

缓存策略基于文件校验和。

编辑:让我给一个例子

想象一个dockerfile:

FROM ubuntu:latest
COPY src/ /var/www
RUN php /var/www/setup.php

Docker通过创建层来工作。这个dockerfile将生成一个3层的图像:

  • 第1层:ubuntu最新版本。这一层以图像
  • 中所有文件的校验和命名。
  • 第二层:将在前一层添加/var/www文件夹,其中包含src文件夹的内容。图层将再次使用所有图像文件的校验和来命名。
  • 第3层:setup命令会改变一些文件,并且差异将再次被检查和。

注意docker并不关心外部是什么,只关心内部是什么(这可能是外部的反映)

所以如果你有两个dockerfile在不同的上下文中使用相同的内容,复制到图像的文件将是不同的,因此校验和也会不同,所以它不会混淆你的上下文A和b

最新更新