簡體   English   中英

Dockerfile:使用帶有 pip 安裝 -U pip 的 RUN 語句

[英]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 將(默認情況下)使用pipopencv的緩存安裝並僅安裝pytest 如果你有很多包,這是一個非常節省時間的方法。

順便說一句,同樣的事情也適用於apt-get ——唯一的問題是,正如所解釋的,您可能希望將apt-get installapt-get update組合在一行上,以便為每組 package 安裝。

如果您不使用緩存(即您運行類似docker build. --no-cache之類的東西),那么無論您將所有內容放在一行還是在不同的行上都沒有關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM