2016-01-13 43 views
1

我爲我正在構建的應用程序創建了一個Dockerfile,它有很多大的apt-get軟件包依賴關係。它看起來像這樣:很多apt-get軟件包的高效Dockerfile

FROM ubuntu:15.10 

RUN apt-get update && apt-get install -y \ 
    lots-of-big-packages 

RUN install_my_code.sh 

當我開發我的應用程序,我不斷想出未預料到的軟件包依賴項。但是,由於所有軟件包都在一個Dockerfile指令中,因此即使再添加一個軟件包也會破壞緩存並需要下載並安裝整個批次,這需要花費很長時間。我想知道是否有更好的方法來構建我的Dockerfile?

一個想法是爲每個軟件包分別放置一個RUN apt-get update && apt-get install -y命令,但運行apt-get update可能會節省很多時間。

最簡單的解決方案是在第一個之後添加第二個RUN apt-get update && apt-get install -y作爲所有意料之外的軟件包的搜索結果,但是它們以不直觀的方式劃分軟件包。 (即「當我意識到我需要它時」),我想我可以在依賴關係更穩定時將它們結合起來,但是我發現我總是過於樂觀。

無論如何,如果任何人有更好的方式來構建它,我很樂意聽到它。 (我的所有其他想法都是針對Docker原則的可重複性運行)

回答

1

我認爲您需要在Dockerfile中只運行apt-get update一次,通常在任何其他apt-get命令之前。

您可以首先安裝大量已知程序,如果您想要安裝一個新的程序,只需向您的Dockerfile添加一個新的RUN apt-get install -y abc,然後讓docker繼續執行之前緩存的命令。定期(每週一次,每月一次?),您可以根據自己的需要重新組織它們,或者在一個命令中運行所有內容。

我想我可以將它們結合起來,當依賴關係更穩定時,但我發現我總是過於樂觀。

哦,您實際上已經提到過這個解決方案了,無論如何,這些「調整」無時不在。只運行apt-get update一次。

+0

查看https://docs.docker.com/engine/articles/dockerfile_best-practices/爲什麼apt-get更新應該/必須在與升級相同的指令中運行(向下滾動到apt-get頭) – mrjogo

+0

關於緩存的好處以及它並不總是有意的。 「由於apt-get更新沒有運行,您的構建可能會獲得curl和nginx包的過時版本。」雖然這是真的,但即使您在同一個命令中使用'update'和'install',如果您在數月內繼續使用相同的緩存層,您也可能會意外地使用舊捲曲。或者,如果您在'install curl'之後添加'RUN update && install nginx',您可以使用舊的curl,但新的nginx。也許這是將所有安裝連接到單個命令的另一個理由。 – NikoNyrh