Docker在构建映像时如何使用缓存

时间:2017-05-16 13:56:05

标签: docker dockerfile

当我重建图片时,docker会对某些图层使用缓存,但对其他图层不会使用缓存:

Step 1/10 : FROM ubuntu:16.04
 ---> 6a2f32de169d
Step 2/10 : MAINTAINER User R "mail@gmail.com"
 ---> Using cache
 ---> c80135951886
Step 3/10 : RUN apt-get update && apt-get install -y python3 python3-pip
 ---> Using cache
 ---> e2fb88917cc1
Step 4/10 : ADD . /srv/dataset-service
 ---> 9504708a88ae
Removing intermediate container 76532d1a35a9
Step 5/10 : WORKDIR /srv/dataset-service
 ---> 4e94e0b03138
Removing intermediate container 71b7acc78bd5
Step 6/10 : RUN pip3 install -r requirements.txt && pip3 install grpcio-tools && pip3 install .
 ---> Running in 7356d49ae7a5
Collecting psycopg2==2.7.1 (from -r requirements.txt (line 1))  
...............................................................
...............................................................

1到5的图层是从缓存构建的,但是第六层是从头开始的。为什么docker不使用缓存作为第六层?

1 个答案:

答案 0 :(得分:1)

Docker使用您指定的指令来确定该指令的缓存层是否可以重复使用。

基本上,只要确定给定指令的结果与当前缓存层不同,相关层就会失效。

单个图层无效后,其后的所有图层也必须无效。

实际上,步骤4中的图层被认为与先前构建/缓存的图层不同。这很可能是因为您在应用程序中更改了代码或配置。一旦确定第4层不同,之后的所有层缓存都被视为无效,必须重新构建。

从pip,node.js'npm,ruby的gem等不断重新安装模块的常见解决方法是在复制代码之前安装这些模块。这样,您可以为模块创建图层缓存,同时仍然可以修改代码。

在node.js Dockerfile中,它看起来像这样:


FROM node:6.9.5

RUN mkdir -p /var/app
WORKDIR /var/app

COPY ./package.json /var/app
RUN npm install --production

COPY . /var/app

# ...

这将创建项目文件夹,仅复制带有依赖项列表的package.json文件,然后安装所需的模块和库。完成后,将复制其余代码。

在您的示例中,您将复制requirements.txt以及确定需要哪些pip模块的其他文件。