本文介紹自訂鏡像的背景資訊、基本原理、使用限制和HTTP Server配置要求等。
背景資訊
在雲原生時代,容器鏡像已經逐漸成為軟體部署和開發的標準工具。為最佳化開發人員體驗、提升開發和交付效率,Function Compute提供自訂鏡像,開發人員可以將容器鏡像作為函數的交付物。使用自訂鏡像具有以下優勢。
低成本遷移,無需修改代碼或重新編譯二進位檔案。共用對象(*.so),保持開發和線上環境一致。
避免代碼和依賴分離,簡化分發和部署的步驟。
容器鏡像天然分層緩衝,提高代碼上傳和拉取效率。
標準可複用的第三方庫引用、分享、構建、代碼上傳、儲存和版本管理,豐富的開源生態CI/CD交付體驗。
可通過HTTP協議和Function Compute系統互動。
可運行無需互動的鏡像。
基本原理
Function Compute系統初始化執行環境執行個體前會扮演該函數的服務角色(Service Role),獲得臨時使用者名稱和密碼並拉取鏡像。拉取成功後,根據指定的啟動命令Command和參數Args啟動您的鏡像。
容器鏡像交付物需要包含HTTP Server。Function Compute通過配置的CAPort連接埠監聽您定義的HTTP Server,此HTTP Server將接管Function Compute的所有請求,包括通過API調用和通過HTTP調用的請求。您在開發函數具體的互動邏輯之前,一般需要確認開發的是通過API調用函數還是通過HTTP請求調用函數,原理如下所示:
通過API調用函數
通過HTTP請求調用函數
使用限制
鏡像大小限制
ACR個人版、企業版基礎版、企業版標準版和進階版,CPU執行個體最大支援10 GB的未解壓鏡像,GPU執行個體最大支援15 GB的未解壓鏡像。
鏡像倉庫
支援拉取阿里雲Container Registry的企業版和個人版倉庫中的鏡像。
鏡像訪問
目前僅ACR個人版公開鏡像支援跨帳號同地區讀取,其餘鏡像僅支援同帳號同地區下私人鏡像倉庫讀取。
容器內檔案讀寫權限
容器run-as-user UID預設是Root使用者ID,即UID=0
。如果您在Dockerfile中指定了具體的使用者,則會以指定的使用者運行該容器鏡像。
容器可寫層儲存空間限制
排除唯讀鏡像層,容器產生的資料大小限制為512 MB或10 GB,同函數進階配置項中的磁碟大小。具體資訊,請參見建立函數。
容器可寫層資料不是持久化的,資料會隨著容器被銷毀而刪除。如果需要持久化儲存,可以考慮使用Function Compute掛載NAS或者OSS。具體操作,請參見配置NAS檔案系統和配置OSSObject Storage Service。或者使用其他共用儲存服務,例如Table Store等。
鏡像架構限制
目前Function Compute僅支援AMD64鏡像架構,因此,針對搭載Apple晶片的Mac電腦(或其他ARM架構的機器),構建鏡像時需要指定鏡像的編譯平台為Linux/Amd64。參考命令如docker build --platform linux/amd64 -t $IMAGE_NAME .
。
構建完成後,可執行docker inspect
進行檢查。如果返回內容包含 "Architecture" : "amd64"
,則表示構建的鏡像正確。
HTTP Server配置要求
以下要求僅適用於Web Server模式的自訂鏡像函數:
自訂鏡像啟動的服務一定要監聽
0.0.0.0:CAPort
或*:CAPort
連接埠。如果您使用127.0.0.1:CAPort
連接埠,會導致請求逾時,出現以下錯誤:{ "ErrorCode":"FunctionNotStarted", "ErrorMessage":"TheCA'shttpservercannotbestarted:ContainerStartDuration:25000000000.PingCAfaileddueto:dialtcp21.0.XX.XX:9000:getsockopt:connectionrefusedLogs:2019-11-29T09:53:30.859837462ZListeningonport9000" }
自訂鏡像的監聽連接埠,即函數屬性CAPort預設是9000。如果自訂鏡像使用預設的監聽連接埠,那麼實現的自訂鏡像的HTTP Server監聽的連接埠也必須是9000。 如果自訂鏡像使用的監聽連接埠是8080,那麼實現的自訂鏡像的HTTP Server監聽的連接埠也必須是8080。
Connection需要設定為Keep-Alive,Server端請求逾時時間需設定在15分鐘及以上。樣本如下:
//例如,Node.js使用Express時。 var server = app.listen(PORT, HOST); server.timeout = 0; // never timeout server.keepAliveTimeout = 0; // keepalive, never timeout
HTTP Server需要在120秒內啟動完畢。
公用要求標頭
自訂鏡像的公用要求標頭和自訂運行時的公用要求標頭一致。更多資訊,請參見Function Compute公用要求標頭。
日誌格式
自訂鏡像中所有列印到標準輸出(Stdout)的日誌會自動收集到您指定的Log Service中。關於配置日誌功能的具體操作,請參見配置日誌。
自訂鏡像的日誌格式與自訂運行時的日誌格式一致。更多資訊,請參見函數日誌格式。
冷啟動最佳化最佳實務
相比於程式碼封裝,容器鏡像依賴的基礎環境會帶來額外的資料下載和解壓的時間。為了更好的冷啟動體驗,推薦您使用以下最佳實務:
計費說明
自訂鏡像的計費項目與其他類型運行時的計費項目一致。更多資訊,請參見計費概述。
其中,鏡像資源使用量中的執行時間是從倉庫拉取鏡像到拉取鏡像結束的時間長度。例如,1024 MB記憶體的執行個體拉取鏡像耗時10秒,則本次拉取鏡像的資源消耗量為10 GB*秒。
容器鏡像在一定時間範圍內有緩衝,因此並不是每次冷啟動一定會產生鏡像拉取的費用。