当我重新构建镜像时,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的层是从缓存构建的,但从第6层开始是从头开始的。为什么docker不在第六层使用缓存?
发布于 2017-05-16 22:18:48
Docker使用您指定的指令来确定该指令处的缓存层是否可以重用。
基本上,只要给定指令的结果被确定为与当前缓存层不同,所讨论的层就会失效。
一旦单个层无效,之后的所有层也必须无效。
实际上,步骤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文件,然后安装所需的模块和库。完成后,其余的代码将被复制。
在您的示例中,您将复制确定需要哪些pip模块的requirements.txt和其他文件。
https://stackoverflow.com/questions/44003513
复制相似问题