為了將我的容器更新到最新版本的 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
編輯:經過更多研究后,我發現這個問題類似于How to get docker-compose to always re-create container from fresh images?. 此特定示例中缺少的部分是docker pull php:8.0-apache.
我不明白為什么。為什么我必須手動拉取基礎鏡像的新版本?
修剪 ( docker system prune, docker builder prune -a) 對這個問題沒有影響,即使在關閉容器之后也是如此。
uj5u.com熱心網友回復:
有一個通用的 Docker 規則,如果你在本地已經有一些鏡像,它只是在不檢查 Docker Hub 的情況下使用。正如@BMitch 在他們的回答中指出的那樣,較新的 BuildKit 引擎應該驗證您確實擁有最新版本的影像,但可以手動更新它。
在您的情況下,您已經在php:8.0-apache本地擁有一個影像(使用 PHP 8.0.8)。所以你可以手動獲取更新的基礎鏡像
docker pull php:8.0-apache
docker-compose build
如果基礎鏡像發生了變化,這將使快取失效,所以這里不需要--no-cache。這也適用于“經典”構建器(盡管您的輸出確實表明您正在使用更新的 BuildKit 引擎)。
這是一個足夠常見的序列,因此有一個簡寫形式
docker-compose build --pull
uj5u.com熱心網友回復:
對于基本映像,CACHED實際上意味著“已驗證”,其中 buildkit 已查詢注冊表以檢查當前基本映像摘要,并看到基本映像摘要與它已經下拉的內容匹配。此 GitHub 問題中提供了更多詳細資訊。
我能想到不使用該快取的原因只有兩個。首先是您的本地構建快取是否損壞。在這種情況下,清除您的本地快取 ( docker builder prune)。另一種情況是 sha256 沖突,如果發生這種情況,注冊服務器本身可能會被破壞,修復構建器是最不關心的問題。
使用的原因--no-cache是確保再次執行可能導致不同輸出的步驟,并且在此示例中正在執行此操作。
uj5u.com熱心網友回復:
您可以執行以下操作:
docker-compose up --force-recreate
或類似的東西:
docker-compose down --rmi all --remove-orphans && docker-compose up --force-recreate
這將洗掉所有影像,因此請自行決定使用。參考這里docker-compose down的命令
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/490318.html
