如何強制執行 Docker 映象的乾淨構建?
當您執行 Docker pull 命令或 Docker run 命令時,守護程序首先透過比較映象的摘要來檢查本地機器中是否存在類似的映象。
如果找到匹配項,則無需搜尋登錄檔以查詢映象,守護程序只需建立已存在映象的副本即可。但是,如果找不到副本,它將開始從登錄檔中提取它。當您嘗試使用 Dockerfile 構建映象時,情況也是如此。
我們都知道 Docker 映象是多層檔案,包含多個彼此疊加的映象層。Dockerfile 中提到的每個指令都負責建立一個新層。
一個層僅包含前一層和當前層之間的差異。如果您之前構建過相同的映象,守護程序將查詢包含相同映象層的快取。如果找到後續快取,它將簡單地使用此快取,而不是構建新層。
但是,在某些情況下,您可能希望強制執行映象的乾淨構建,即使後續層的構建快取存在。在這裡,Docker 也能幫到您。讓我們看看如何強制乾淨構建 Docker 映象。
考慮以下 Dockerfile。
RUN apt-get update RUN apt-get -y install vim
在上面的 Dockerfile 中,我們在單獨的行中使用了兩個不同的 RUN 指令。這會導致構建單獨的映象層和構建快取。當 Docker 守護程序處理更新命令(例如 RUN apt-get -y update)時,不會比較容器中更新命令作用的那些包以確定是否發生了快取命中。在這種情況下,僅比較命令字串以查詢匹配項。
與其對兩個連續的 RUN 指令使用兩行,不如將它們連結起來以減少映象層的數量,從而減少快取命中的可能性。
RUN apt-get update && apt-get -y install vim
如果您根本不想允許守護程序執行快取檢查,可以使用 **--no-cache** 選項來實現。當您使用 Docker build 命令構建 Docker 映象時,您可以簡單地使用 --no-cache 選項,這將允許您指示守護程序不要查詢已存在的映象層,而只是強制乾淨構建映象。
例如,如果您想從以下 Dockerfile 構建映象 -
FROM ubuntu:latest WORKDIR /app COPY . . MAINTAINER admin@tutorialspoint.com RUN apt-get -y update RUN apt-get install -y openjdk-7-jdk RUN apt-get install -y git-core RUN apt-get install -y build-essential RUN apt-get install -y lsb-release CMD ["javac", "sample.java"]
假設您之前已經構建過此映象,並且現在您在構建上下文中進行了一些更改。因此,COPY 指令快取以及所有後續指令的快取都會失效。如果您沒有進行任何更改並且再次構建了映象,則不會發生快取失效,守護程序只需使用映象層的現有快取來構建映象。
這是預設行為,如果您想覆蓋此預設行為,可以在 Docker build 命令中使用 --no-cache 選項。
$ docker build --no-cache -t sample-image:sample-tag .
當您執行此命令時,守護程序不會查詢現有映象層的快取構建,而是會強制從 Dockerfile 中乾淨構建 Docker 映象。
如果您使用 Docker compose,可以使用以下命令。
$ docker-compose build --no-cache
您還可以將其與 up 命令連結以重新建立所有容器。
$ docker-compose build --no-cache && docker-compose up -d --force-recreate
請注意,這些方法不使用快取,但構建器和基礎映象是使用 FROM 指令引用的。您可以使用以下方法清理構建器快取 -
$ docker builder prune -af
如果您不想使用其快取,也可以清除父映象。
$ docker image rm -f parent-image
這些是您可以採用以強制乾淨構建映象並避免使用映象層快取的最常見方法。最好且可能最簡單的選擇是使用 --no-cache 選項。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP