当前位置: 首页 > 知识库问答 >
问题:

Docker build没有使用缓存

嵇浩淼
2023-03-14

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"]

共有1个答案

司徒翼
2023-03-14

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

RUN mkdir /code

之后,执行:

COPY . /code

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

若要改进缓存,请考虑将变化较小的行放置在 Docker 文件的顶部。这将使 COPY . /code 行位于文件的最末尾,因为它几乎每次都会更改。

您还应该在 .dockerignore 文件中包含不需要的文件,以避免其更改破坏缓存。例如,.泊克里尼奥可以包含:

Dockerfile
.git

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

*
!Makefile
!app/

在进行< code >复制时,上述内容将仅包括< code>Makefile和< code>app目录。/code,其他的都将被忽略。

 类似资料:
  • 问题内容: 我发现一些线程说这是可行的,但是没有找到特定的指令或配置信息。 我也想从Beanstalk中做到这一点:应将应用程序部署到Beanstalk,并使用一个将hibernate状态指向Elasticache实例的配置。 问题答案: 是的,我们能够使用2级缓存配置hibernate状态。虽然没有使用beantalk。此代码应该可以帮助您。 您还需要hibernate的memcached ja

  • 问题内容: 我读过,为避免在nodejs中缓存,必须使用: 但是我不知道如何使用它,因为当我在代码中添加该行时会出错。 我的功能(我认为我必须不编程缓存)是: 有人知道如何在我的代码中不放置任何缓存吗?谢谢 问题答案: 您已经编写了标题。我认为您完成此操作后无法添加更多内容,因此只需将标题放在第一个对象中即可。

  • 我正在使用Maven 3.0.4和Nexus 2.0.6。我已经按照Nexus说明设置了我的settings.xml,以便使用单个存储库。当maven试图运行maven-U clean时,我得到以下错误。 如果我从设置中删除nexus镜像,直接转到maven中心,命令就会工作。nexus中maven repo的设置显示它处于服务状态,并且位于公共组中(最后列出)。 我不是背后的代理访问互联网。 这

  • 未能解析配置“:classpath”的所有工件。:无法解析com.android.tools.build:gradle:3.6.1。 由:org.gradle.internal.resolve.ModuleVersionResolveException引起:脱机模式下没有com.android.tools.build:gradle:3.6.1的缓存版本。 我将Android Studio升级到5.

  • classpath : herosphp\cache\CacheFactory herophp的缓存是通过缓存工厂来管理的,CacheFactory 负责创建缓存,默认采用的是单例模式,也就是同一类型的缓存在应用中只会存再一个实例。 $cacher = CacheFactory::create('file', true); 我们为缓存工具定义了一个 ICache接口,它定义了以下接口方法: get

  • 下面是我的AJAX函数: 如在铬合金中观察到的 即使在后续调用中,请求头也总是相同的: Chrome不应该在收到ETag标头后缓存资源并在后续调用相同URL时设置“If-Noo-Match”标头吗?我不应该获得304而不是200的状态码,因为返回的内容是相同的吗? 不过,对其他服务器(如Google地图服务器)中的资源的调用有时会返回304。