Docker在构建映像时如何使用缓存
重建图像时,Docker在构建映像时如何使用缓存,docker,dockerfile,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 python
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不对第六层使用缓存?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模块的文件。请查看类似问题