ONBUILD 指令

ONBUILD [INSTRUCTION]

當影象用作另一個構建的基礎時,ONBUILD 指令向影象新增將在稍後執行的觸發指令。觸發器將在下游構建的上下文中執行,就好像它已經在下游 Dockerfile 中的 FROM 指令之後立即插入一樣。

任何構建指令都可以註冊為觸發器。

如果要構建將用作構建其他映像的基礎的映像(例如,可以使用特定於使用者的配置自定義的應用程式構建環境或守護程式),這將非常有用。

例如,如果你的映像是可重用的 Python 應用程式構建器,則需要將應用程式原始碼新增到特定目錄中,並且可能需要在此之後呼叫構建指令碼。你現在不能只呼叫 ADDRUN,因為你還無法訪問應用程式原始碼,並且每個應用程式構建都會有所不同。你可以簡單地為應用程式開發人員提供一個樣板 Dockerfile 來複制貼上到他們的應用程式中,但這樣做效率低,容易出錯且難以更新,因為它與特定於應用程式的程式碼混合在一起。

解決方案是使用 ONBUILD 註冊預先指令,以便在下一個構建階段執行。

以下是它的工作原理:

當遇到 ONBUILD 指令時,構建器會為正在構建的影象的後設資料新增觸發器。該指令不會影響當前構建。

在構建結束時,所有觸發器的列表都儲存在映像清單中的 OnBuild 鍵下。可以使用 docker inspect 命令檢查它們。稍後,可以使用 FROM 指令將影象用作新構建的基礎。作為處理 FROM 指令的一部分,下游構建器查詢 ONBUILD 觸發器,並按照它們註冊的順序執行它們。如果任何觸發器失敗,則中止 FROM 指令,這反過來導致構建失敗。如果所有觸發器都成功,則 FROM 指令完成,並且構建繼續照常進行。

執行後,觸發器將從最終影象中清除。換句話說,它們不是由大孩子構建繼承的。

例如,你可以新增以下內容:

[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]

警告:不允許使用 ONBUILD ONBUILD 連結 ONBUILD 指令。

警告:ONBUILD 指令可能不會觸發 FROMMAINTAINER 指令。