2017-02-17 51 views
0

在Dockerfile我有一個是從裝入基本映像節,這樣說docker是否構建兩次運行命令?

FROM mysql:5.7 

的Dockerfile內爲MySQL運行和apt-get update命令,但我不明白的是爲什麼我需要在我自己的Dockerfile中的FROM語句之後運行apt-get update?我知道我需要運行apt-get更新,因爲隨後的命令會失敗,直到我運行apt-get,但我認爲FROM映像已經運行了這些命令?

回答

0

望着Dockerfile for mysql,你會看到一個模式像上幾個RUN命令如下:

RUN apt-get update \ 
&& apt-get install -y --no-install-recommends \ 
     ca-certificates \ 
     wget \ 
&& rm -rf /var/lib/apt/lists/* 

第一線採集包回購的當前狀態,那麼安裝運行,並最後,軟件包回購狀態從文件系統中刪除。這是繼best practices from Docker以防止兩個問題:

  1. 在相同的運行命令清理不需要的文件,以防止圖像層膨脹。
  2. 刪除最終會變陳舊並導致錯誤的緩存數據,一旦它變得陳舊就應該重用。

常見的錯誤是試圖用兩個單獨的RUN命令將apt-get updateapt-get install分開。由於docker緩存圖層的方式,如果apt-get update命令與很久以前運行的命令相同,docker將重新使用緩存的結果。如果您然後更改apt-get install命令以包含不同的軟件包,則會發現映像將無法生成,因爲緩存的更新命令指向不再位於軟件包儲存庫中的映像。