使用–no-cache构建镜像大多情况下足够解决由于缓存引起的问题。不过有时候你想要一个更细粒度的解决方案。例如你构建的镜像需要时间比较长,你仍然想一些步骤使用缓存,然后从指定的点开始不使用缓存重新运行命令构建镜像。
问题
你想在构建镜像时设置从Dockerfile的指定位置开始使缓存失效。
解决方法
在命令的后面添加注释来使缓存失效。
讨论
例如我们在以下的Dockerfile中的CMD命令后添加注释以让缓存从这里失效:
- FROM node
- MAINTAINER ian.miell@gmail.com
- RUN git clone https://github.com/docker-in-practice/todo.git
- WORKDIR todo
- RUN npm install
- RUN chmod -R 777 /todo
- EXPOSE 8000
- CMD ["npm","start"] #bust the cache
输出为:
- $ docker build .
- Sending build context to Docker daemon 2.56 kB
- Sending build context to Docker daemon
- Step 0 : FROM node
- ---> 91cbcf796c2c
- Step 1 : MAINTAINER ian.miell@gmail.com
- ---> Using cache
- A “normal” docker build
- ---> 8f5a8a3d9240
- Step 2 : RUN git clone -q https://github.com/docker-in-practice/todo.git
- ---> Using cache
- ---> 48db97331aa2
- Step 3 : WORKDIR todo
- ---> Using cache
- ---> c5c85db751d6
- Step 4 : RUN npm install
- ---> Using cache
- ---> be943c45c55b
- Step 5 : EXPOSE 8000
- ---> Using cache
- ---> 805b18d28a65
- Step 6 : CMD ["npm","start"] #bust the cache
- ---> Running in fc6c4cd487ce
- ---> d66d9572115e
- Removing intermediate container fc6c4cd487ce
- Successfully built d66d9572115e
从输出你会看到在第6步已经不使用缓存了,而之前的步骤仍使用缓存,这既缩短了构建镜像的时间,又能解决缓存可能引起的问题。
这个技巧工作的原因是我们在命令后添加了非空字符,所以Docker认为这是一个新的命令,也就不使用缓存了。
你会好奇如果我们更改的是第4步命令RUN npm install,那后面的第5步第6步还会使用缓存吗?答案是从更改的第4步开始下面的就不能使用缓存了。所以由于这个原因,建议尽可能的把一些不常需要变更的命令往上移。