關於docker build時間過久及add不能跨檔案的問題

然月枕流君發表於2015-10-18

我們使用自動程式buildimage映象,其中過程中發現很多詭異的問題, 有很多尚在解決中, 但是同時buildimage, 高頻度的連續buildimage依然有部穩定的情況,特別在超過5G以上的映象時,發生的概率極高.

我們先說兩個問題:

    1. docker build 時間過久,其中絕大部分時間在Sending build context to Docker daemon(dockerfile的編寫優化方案,網上很多此處不贅述)

    2. dockerfile add時,不能使用本級目錄以外的其他目錄及檔案.

以上兩個問題都是因為一個設計問題影響所致.

根檔案

   |

   |-  Dockerfile

   |

   |- 資料夾1

   |- 資料夾2

docker build upload時間過久是因為啟動時載入本層級目錄所有的檔案, 如上述載入根檔案的所有檔案,包括資料夾1,資料夾2, 如果本級目錄檔案較多,則載入時間是非常慢,因此build dockerfile時應在一個葉子資料夾中執行build.

相關client原始碼:

// opts.ContextDir 是 build的資料夾
if opts.ContextDir != "" {
        if opts.InputStream != nil {
            return ErrMultipleContexts
        }
        var err error
        // 載入本級目錄,也是影響時間核心問題
        if opts.InputStream, err = createTarStream(opts.ContextDir, opts.Dockerfile); err != nil {
            return err
        }
}

由於流載入是包括本級目錄的,故此upload的時間會過長.

docker add時使用也是由此處載入有關, 程式會將本地資料夾拷貝到/var/lib/docker/tmp中,從而在tmp中向容器內部拷貝,故此他時沒有辦法跨目錄的.

tmp

   |

   |-  Dockerfile

   |

   |- 資料夾1

   |- 資料夾2


相關文章