首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker如何在构建镜像时使用缓存

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

Stack Overflow用户
提问于 2017-05-16 21:56:05
回答 1查看 175关注 0票数 1

当我重新构建镜像时,docker对某些层使用缓存,但对其他层不使用缓存:

代码语言:javascript
复制
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不在第六层使用缓存?

EN

回答 1

Stack Overflow用户

发布于 2017-05-16 22:18:48

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

基本上,只要给定指令的结果被确定为与当前缓存层不同,所讨论的层就会失效。

一旦单个层无效,之后的所有层也必须无效。

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

经常从pip、node.js的npm、ruby的gem等重新安装模块的常见解决方法是在复制代码之前安装这些模块。这样,您可以拥有模块的层缓存,同时仍然能够修改您的代码。

在node.js Dockerfile文件中,它将如下所示:

代码语言:javascript
复制
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和其他文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44003513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档