[英]Dockerfile: using RUN statement with pip install -U pip
Dockerfile 最佳實踐為apt-get update
使用提供了以下建議:
始終在同一 RUN 語句中將 RUN apt-get update 與 apt-get install 結合使用。
我是否也應該對pip install -U pip
使用相同的規則? 例如,在 Dockerfile 中哪種做法更可取:
# Separate statements
RUN pip install -U pip
RUN pip install opencv-python==4.4.0.46
# Single statement
RUN pip install -U pip && pip install opencv-python==4.4.0.46
Dockerfile 最佳實踐的要點是在創建緩存的同一層中刪除緩存。 對於pip
,這意味着使用--no-cache-dir
選項或在安裝后顯式刪除緩存。
這兩個代碼片段最終將導致相同的圖像大小。 但是 docker 也建議盡可能使用更少的層,所以我更喜歡第一種方式(使用一個RUN
指令)。
RUN pip install -U --no-cache-dir pip \
&& pip install --no-cache-dir opencv-python==4.4.0.46
RUN pip install -U --no-cache-dir pip
RUN pip install --no-cache-dir opencv-python==4.4.0.46
關於apt-get update && apt-get install...
的建議並不真正適用於pip
。 apt 依賴於apt-get update
下載的一些文件,最好的做法是在任何apt-get install
之后刪除這些文件。 這會減小 Docker 圖像大小。 Pip 總是在互聯網上詢問可用的軟件包。
您應該參考這個SO 答案。 簡而言之,您應該始終在apt-get install
之前進行apt-get update
。 將這些語句放在不同的行上意味着 Docker 將分別緩存它們。 如果您重新運行 Docker 構建,Docker 可能會使用緩存的apt-get update
,從而安裝舊軟件包。
這與 pip 不同 - 它將始終嘗試安裝可用的最新 package 版本(除非您明確指定版本)。 在您給出的情況下,您可以將語句縮短為RUN pip install -U pip opencv-python==4.4.0.46
。
為方便起見,您可能希望將安裝分組到不同的RUN
狀態,以便 Dockerfile 更易於閱讀,並且您不必重新安裝所有內容,以防您想要添加/刪除 package。 So, for example, if you have pip
and opencv
on a single line and you add pytest
on that same line, when you run docker build
again, it will install pip
and opencv
as well. 另一方面,如果您像這樣拆分行:
RUN pip install -U pip opencv-python
RUN pip install -U pytest
並構建,Docker 將(默認情況下)使用pip
和opencv
的緩存安裝並僅安裝pytest
。 如果你有很多包,這是一個非常節省時間的方法。
順便說一句,同樣的事情也適用於apt-get
——唯一的問題是,正如所解釋的,您可能希望將apt-get install
和apt-get update
組合在一行上,以便為每組 package 安裝。
如果您不使用緩存(即您運行類似docker build. --no-cache
之類的東西),那么無論您將所有內容放在一行還是在不同的行上都沒有關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.