caching - Docker 构建未使用缓存

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,其他所有内容都将被忽略。

https://stackoverflow.com/questions/45929081/

相关文章:

java - Ant scp 任务不起作用,即使在 ant/lib 上使用 jsch

c++ - C++ 依赖生产没有自动化的理论原因是什么?

Android NDK - 使两个 native 共享库相互调用

build - 递归 CMake 搜索头文件和源文件

java - 多个存储库的 Maven 设置

c - 如何编译 GnuTLS

c++ - 当 CMake 中的生成器或输入发生更改时,如何仅构建自动生成的代码?

c++ - 关于如何部署 C++ 代码以在任何地方工作的提示

ios - 使用 iOS 构建主机时 Xamarin 实际在做什么?

macos - OS X : MACOSX_RPATH is not specified for t