【问题标题】:How Docker uses cache while building an imageDocker 在构建镜像时如何使用缓存
【发布时间】:2017-05-16 22:18:47
【问题描述】:

当我重建图像时,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 第六层不使用缓存?

【问题讨论】:

标签: docker dockerfile


【解决方案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 模块的文件。

【讨论】:

    猜你喜欢
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 2020-10-06
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多