为了将我的容器更新到PHP 8.0的最新版本(在编写本文时是8.0.20),我尝试运行
$ docker compose build --no-cache
[+] Building 148.2s (24/24) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.97kB 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/php:8.0-apache 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 6.17kB 0.0s
=> CACHED [base 1/9] FROM docker.io/library/php:8.0-apache 0.0s
=> [base 2/9] RUN a2enmod rewrite
...
但从输出中可以看出,只有第2步及更高版本被重建,基础映像仍在从缓存中读取,导致PHP版本8.0.8。
如何在不使用旧缓存的情况下强制完全重建?
$ docker --version
Docker version 20.10.12, build 20.10.12-0ubuntu4
$ docker compose version
Docker Compose version v2.4.0
Dockerfile顶部:
FROM php:8.0-apache as base
# Apache rewrite module
RUN a2enmod rewrite
编辑:经过更多的研究,我发现这个问题类似于,也可能是重复的,如何让docker compose总是从新图像中重新创建容器?。这个特定示例中缺少的部分是docker pull php:8.0-apache。
但我不明白为什么。为什么我必须手动提取基础图像的新版本?
修剪(docker system prune,
docker builder prune-a)对这个问题没有影响,即使在拆下容器之后。
您可以执行以下操作:
docker-compose up --force-recreate
或者类似这样:
docker-compose down --rmi all --remove-orphans && docker-compose up --force-recreate
这将删除所有图像,因此请自行决定使用。此处参考docker compose down命令
对于基本图像,CACHED实际上意味着“已验证”,其中buildkit已查询注册表以检查当前的基本图像摘要,并查看基本图像摘要与已下拉的内容匹配。更多细节可在本期GitHub中找到。
我能想到的不使用缓存的原因只有两个。首先是您的本地生成缓存是否损坏。在这种情况下,清除本地缓存(
docker builder prune)。另一种情况是sha256冲突,如果发生这种情况,注册表服务器本身可能会损坏,修复生成器是最不重要的。
使用“无缓存”的原因是为了确保再次执行可能导致不同输出的步骤,本例中就是这样做的。
有一个通用的Docker规则,如果您在本地已经有一些图像,则只需在不检查Docker Hub的情况下使用。正如@BMitch在他们的回答中指出的那样,较新的BuildKit引擎应该验证您确实拥有最新版本的图像,但可以手动更新。
在您的情况下,您在本地已经有一个php: 8.0-apache
映像(使用PHP 8.0.8)。因此您可以手动获取更新的基础映像
docker pull php:8.0-apache
docker-compose build
如果基础图像已更改,这将使缓存无效,因此您不需要在此处使用缓存。这也适用于“经典”生成器(尽管您的输出确实表明您正在使用较新的BuildKit引擎)。
这是一个足够常见的序列,有一个速记
docker-compose build --pull
问题内容: 我正在测试一些针对强大压力的JSON API。然而,在某一时刻,响应时间趋于平稳的“趋势”。它增加到一个很高的点,然后下降到一个永不改变的响应时间。 我尝试取消所有两个JMeter缓存管理器选项,并将最大缓存大小设置为1。还添加了一个HTTP标头,该标头在Cache-Control上的最大寿命为零。 如何完全禁用JMeter中的缓存? 注意 : 我搜索了相关文章:但是,出现的是将JMe
问题内容: 每次我在IDEA中执行make(一个Java项目)时,编译过程都会挂起,显示“已完成,正在保存缓存”。我必须终止该过程,然后才能继续。我尝试使用文件->使缓存无效,但未成功。 有任何想法吗? 问题答案: 另一个解决方法是将Mac的主机名/etc/hosts与localhost一起添加到文件中,如下所示: 这为我解决了问题。
我想澄清一些关于hibernate二级缓存的问题。需要澄清的一点是,HQL查询是否总是会击中数据库(至少对于获取id)。 假设我们有实体 地址的数据库表有一个对客户(id)的外键引用,以支持一对多关系。 作为前提条件,我已将hibernate的2级缓存启用为EHcache。只有实体和关联被设置为可缓存。未启用查询缓存。 我知道如果我使用这个会话。get()或会话。load()多次,只有第一次调用才
我使用workbox运行时缓存来缓存外部调用(materialize.css就是其中之一)。在“我的网络”选项卡中,它显示请求来自serviceWorker(看起来不错): 但是在缓存存储上,我的运行时缓存看起来是空的: 你可以在chromes的应用标签上看到我的服务人员,这是网站:https://quack.surge.sh/ 服务工作者代码: 这是预期的行为吗?我对服务人员还很陌生,我不确定什
问题内容: 我已经在Windows 7 x64开发机器上以手动方式安装了Node.js: 我将主节点x64二进制文件与npm软件包管理器一起放在中。像超级按钮一样工作,我无需处理安装程序就可以更新主二进制文件。 我无法解决的唯一问题是移动缓存文件夹。当我安装本地软件包时: …缓存位于文件夹下。我想将其更改为: 如何更改npm缓存文件夹或完全禁用它? 问题答案: 您可以使用命令行更改npm缓存文件夹
设置为和设置为in。 当我运行时,它显示,但我的目录中仍有236K个文件。 对此感到沮丧,我还使用从该目录手动删除了下的所有文件/目录。 现在,当我运行时,我得到 所以,我手上有两个问题。首先是:为什么Artisan没有删除所有缓存文件?如何安全地删除它们?第二个问题是:我如何从这恢复,以便PHP工匠队列:重启不会在我身上出错? 更新:我突然想到,如果设置为,我可能没有理由重新启动队列工作程序,因