caching - Docker 构建未使用缓存

标签 caching docker build

docker build 没有使用它的缓存。

docker build -f Dockerfile .

生成与此相同的输出:

docker build -f Dockerfile --no-cache .

我正在修改 Dockerfile,在文件末尾添加命令。所以前面的层应该被缓存并且有效。

我有足够的磁盘空间。

有什么想法吗?

Docker 版本 17.06.1-ce,构建 874a737

Dockerfile:

FROM registry:5000/base/python:xenial

RUN mkdir /code
COPY . /code

RUN apt-get update && \
    apt-get install -y \
    vim \
    less

COPY /etc/foo /etc/foo

ENTRYPOINT ["/bin/bash"]

最佳答案

从您的 Dockerfile 中,如果您在 Dockerfile 中附加行,或更改正在构建的代码,则只有一行可以被缓存:

RUN mkdir /code

之后,您执行:

COPY . /code

由于您更改了 Dockerfile,. 的内容也发生了变化(Dockerfile 是 . 的一部分),因此 COPY 需要再次执行,生成一个新层。生成新层后,后续的每个层都不再有缓存,需要重新构建。

要改进缓存,请考虑将更改较少的行放在 Dockerfile 的顶部。那将留下 COPY 。/code 行放在文件的最后,因为它几乎每次都会改变。

您还应该在 .dockerignore 文件中包含不需要的文件,以避免它们的更改破坏缓存。例如。 .dockerignore 可以包含:

Dockerfile
.git

或者我倾向于使用反向文件,忽略所有内容,然后重新包含构建应用程序所需的特定文件:

*
!Makefile
!app/

执行 COPY 时,上述内容仅包括 Makefileapp 目录。/code,其他所有内容都将被忽略。

关于caching - Docker 构建未使用缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45929081/

相关文章:

c - 高速缓存的哈希函数好吗?

c# - 将 MemoryCache 内容持久化到文件

caching - 如何在PhoneGap中缓存图像和html文件

docker - 无法构建kubernetes-certbot docker容器

docker 撰写 : No such image

xml - 为什么在Eclipse项目中更改xml文件会触发项目自动构建

linux - 自动化 Ubuntu 构建(或任何 Linux 发行版)

php - 如何将 Laravel View 转换为静态 HTML 并从缓存中提供它们?

mysql - 在 Dockerfile 中创建 MySQL 数据库时出错

c++ - 体系结构 x86_64 : and cannot find the reason 的 undefined symbol