Docker实践(26) – 设置从Dockerfile指定点缓存失效

使用–no-cache构建镜像大多情况下足够解决由于缓存引起的问题。不过有时候你想要一个更细粒度的解决方案。例如你构建的镜像需要时间比较长,你仍然想一些步骤使用缓存,然后从指定的点开始不使用缓存重新运行命令构建镜像。

问题

你想在构建镜像时设置从Dockerfile的指定位置开始使缓存失效。

解决方法

在命令的后面添加注释来使缓存失效。

讨论

例如我们在以下的Dockerfile中的CMD命令后添加注释以让缓存从这里失效:

  1. FROM node
  2. MAINTAINER ian.miell@gmail.com
  3. RUN git clone https://github.com/docker-in-practice/todo.git
  4. WORKDIR todo
  5. RUN npm install
  6. RUN chmod -R 777 /todo
  7. EXPOSE 8000
  8. CMD ["npm","start"] #bust the cache

输出为:

  1. $ docker build .
  2. Sending build context to Docker daemon  2.56 kB
  3. Sending build context to Docker daemon
  4. Step 0 : FROM node
  5.  ---> 91cbcf796c2c
  6. Step 1 : MAINTAINER ian.miell@gmail.com
  7.  ---> Using cache
  8. A “normal” docker build
  9.    ---> 8f5a8a3d9240
  10. Step 2 : RUN git clone -q https://github.com/docker-in-practice/todo.git
  11.  ---> Using cache
  12.  ---> 48db97331aa2
  13. Step 3 : WORKDIR todo
  14.  ---> Using cache
  15.  ---> c5c85db751d6
  16. Step 4 : RUN npm install
  17.  ---> Using cache
  18.  ---> be943c45c55b
  19. Step 5 : EXPOSE 8000
  20.  ---> Using cache
  21.  ---> 805b18d28a65
  22. Step 6 : CMD ["npm","start"] #bust the cache
  23.  ---> Running in fc6c4cd487ce
  24.  ---> d66d9572115e
  25. Removing intermediate container fc6c4cd487ce
  26. Successfully built d66d9572115e

从输出你会看到在第6步已经不使用缓存了,而之前的步骤仍使用缓存,这既缩短了构建镜像的时间,又能解决缓存可能引起的问题。
这个技巧工作的原因是我们在命令后添加了非空字符,所以Docker认为这是一个新的命令,也就不使用缓存了。
你会好奇如果我们更改的是第4步命令RUN npm install,那后面的第5步第6步还会使用缓存吗?答案是从更改的第4步开始下面的就不能使用缓存了。所以由于这个原因,建议尽可能的把一些不常需要变更的命令往上移。

标签:缓存Docker 发布于:2019-11-20 12:45:39