使用 Dockerfile 建立自定義的映像檔

泰勞先前有簡單介紹過如何使用Docker,不知道各位在使用的過程當中是否有遇到一些困難,例如:某個映像檔缺少了一些編譯特定軟體所需要的套件,或者是某個函式庫的版本不是我想要的,因而造成編譯失敗、進度延遲、專案停擺、主管譴責、老闆不滿、飯碗不保等等,其他可怕情況自行想像。此時你就可以選擇使用Dockerfile來建立自定義的映像檔!

參考資料:
Dockerfile reference 

Docker提供使用者自行編譯映像檔的方法,透過撰寫Dockerfile文件,讓Docker讀取裡面的指令來進行編譯。步驟很簡單,直接創建一個空目錄並在裡面建立一份名為[Dockerfile]的文件即可。

接著透過指令將想要加入的套件或是需要更新的函式庫版本,寫入Dockerfile裡面。需要注意的是必須遵守Dockerfile的撰寫規則,該有的定義一定要有,而最重要且會放置於第一行的就是新的映像檔要以哪個舊有的映像檔為基礎」。

通常會加上維護者的名字,雖然官方沒強制規定,但有建議說明一下。再來就要加入指令來操作映像檔,這裡使用"RUN"來定義編譯時需要執行的指令,例如:我想讓新的映像檔以[ubuntu]這個映像檔為基礎並且安裝libfile-copy-recursive-perl這個套件進去。

撰寫完畢就可以開始進行編譯囉!指令如下所示,此指令會編譯出一個名為kuanlin且標籤為1.0的映像檔。

$ docker build -t kuanlin:1.0 .    // -t:指定標籤資訊
  
看似順利,但人生總是不如意,此時docker編譯出現了錯誤訊息,原來是因為安裝套件時,需要輸入Yes或No,若是透過預先寫好的指令,就要加上-y這個參數。

編譯成功!看一下是否有多出一個名為kuanlin的映像檔。

Proxy

若是你的工作環境比較封閉,有經過代理伺服器(Proxy)的管理,那在編譯時有可能會出現錯誤,類似下圖。

上網搜尋了一些資料,出現此錯誤訊息跟Proxy的設定有關。此時可以試試透過--build-arg參數將Proxy指給docker,讓docker在編譯時不會迷失方向,指令如下所示。

$ docker build --build-arg http_proxy=http://kuanlin.handsome.com.tw:3128 -t kuanlin:1.0 .

另一種方法是在Dockerfile裡面加入Proxy的設定,讓Docker在執行編譯時可以參考。如下圖所示。

這方法對我來說是有用的,但我不能保證適用於所有人,不過網路上還是有很多資料可以參考,應該都是可以解決的。

留言

這個網誌中的熱門文章

程式語言常用之符號與詞彙 - 中英文對照

Repo 實用指令

什麼是 Bootloader?