當Function Compute平台的內建運行時無法滿足您的業務需求時,可以選擇自訂鏡像函數。本文介紹如何在Function Compute控制台或使用Serverless Devs工具建立自訂鏡像函數。
注意事項
在Function Compute中,建立自訂鏡像函數必須使用同一帳號下相同地區內阿里雲鏡像服務倉庫中的鏡像。針對搭載Apple晶片的Mac電腦(或其他ARM架構的機器),構建鏡像時需要指定鏡像的編譯平台為Linux/Amd64,樣本命令如
docker build --platform linux/amd64 -t $IMAGE_NAME .。Function Compute在解析ACR企業版鏡像網域名稱時,使用鏡像倉庫執行個體配置的專用網路預設解析或雲解析PrivateZone自動解析的訪問IP地址。具體情境如下:
情境一:如果ACR企業版執行個體的存取控制頁面的訪問 IP中不存在預設解析標識時,該列表下的所有IP地址均為雲解析PrivateZone自動解析的IP地址,任意一個VPC配置均可使用。

情境二:如果ACR企業版執行個體的存取控制頁面的訪問 IP中存在預設解析標識的IP地址為專用網路預設解析的IP地址,以下圖為例,只能選擇第一個VPC。

使用企業版執行個體時只能選擇非加速鏡像,並且每次更新函數的鏡像配置時,都會基於最新選擇的原始鏡像產生最新的加速鏡像(如果加速鏡像已存在會覆蓋產生)。請不要刪除原始鏡像以及加速鏡像,否則會影響函數調用。
請確保您在函數配置中的鏡像在發生任何變化後,及時更新您的函數,否則函數調用會失敗。
請確保原始鏡像存在,否則函數會進入Failed狀態,並且無法調用。Function Compute雖然對您的函數做了緩衝以加速冷啟動速度,但是在調用過程中依然依賴您的原始鏡像的存在。
請確保您在任何函數中使用的鏡像不要被覆蓋,如果被覆蓋為其他的Digest,請及時使用最新的鏡像資訊重新部署您的函數。Function Compute會同時記錄您在建立和更新配置時所選擇的鏡像版本Tag和Digest,如果您的鏡像版本在別的地方被更新為其他的Digest,函數將調用失敗。
前提條件
Container Registry
- 說明
容器鏡像個人版ACR面向個人開發人員,公測限額免費試用,無SLA承諾和受損賠償,且有使用限制。關於使用限制說明,請參見建立個人版執行個體注意事項。
Serverless Devs(僅選擇使用Serverless Devs建立函數時需要)
在控制台建立函數
登入Function Compute控制台,在左側導覽列,選擇。
在頂部功能表列,選擇地區,然後在函數列表頁面,單擊建立函數。
在彈出的對話方塊,根據提示和實際情境,選擇GPU函數類型,然後單擊建立GPU函數。
在建立GPU函數頁面,設定以下配置項,然後單擊建立。
基礎配置:輸入函數名稱,唯一用於標識函數的符號,在同一帳號及地區下,函數名稱必須唯一且符合命名規範。
彈性配置:選擇執行個體類型,常駐執行個體和彈性執行個體無法同時使用,且函數建立完成後,執行個體類型不支援切換。
彈性執行個體
配置項
說明
樣本
執行個體類型
選擇彈性執行個體,按請求量自動Auto Scaling,無請求後執行個體自動回收,即按使用量計費,不使用不收費。
彈性執行個體
GPU 卡型
選擇GPU卡型。關於各種卡型支援的規格,請參見執行個體類型和規格。
Ada 系列
規格方案
根據您的業務情況,設定函數的顯存、vCPU、記憶體及磁碟規格。設定規格後,實際調用函數產生的各資源使用量均按照規格乘以佔用時間長度計量,詳情請參見計費概述。
說明磁碟中所有目錄可寫,共用磁碟的空間。
磁碟大小與底層執行函數的執行個體生命週期一致,執行個體被系統回收後,磁碟上的資料也會消失。如您需要對檔案進行持久化儲存,可以選擇掛載NAS或OSS。具體操作,請參見配置NAS檔案系統和配置OSSObject Storage Service。
顯存:48 GB
vCPU:8 vCPU
記憶體:64 GB
磁碟:512 MB(不計費,Function Compute提供512 MB的磁碟免費使用額度)
最小執行個體數
如果您的業務對延遲敏感,選擇彈性執行個體後,建議設定最小執行個體數≥1,提前鎖定資源,降低冷啟動延遲。
說明設定最小執行個體數≥1後,如果未配置最小執行個體數彈性策略或某段時間內,無有效彈性策略,則當前最小執行個體數為此處設定的最小執行個體數。
如果配置了多條彈性策略,系統會計算每條策略觸發時的最小執行個體數,並取目前時間有效彈性策略中最小執行個體數的最大值作為當前最小執行個體數。
更多資訊,請參見如何計算當前最小執行個體數?。
1
單一實例並發度
您可以為GPU函數配置單一實例多並發,即單個函數執行個體可以同時處理多個請求。具體操作,請參見配置單一實例並發度。
常駐執行個體
配置項
說明
樣本
執行個體類型
選擇常駐執行個體,即從已購買的常駐資源集區分配執行個體給函數。
希望成本可預測、業務時延敏感、資源使用率高的情境,推薦您使用常駐執行個體,保障業務穩定性。
常駐執行個體
常駐資源集區
常駐資源集區是可以為目標函數分配的常駐執行個體池,如果您的常駐資源集區剩餘額度不足,請單擊操作列的擴容,然後按照介面提示進行擴容。更多資訊,請參見常駐資源集區(訂用帳戶)。
常駐資源集區:fc-pool-****
GPU卡型:Ada
規格方案
根據您的業務情況,設定函數的顯存、vCPU、記憶體及磁碟規格。設定規格後,實際調用函數產生的各資源使用量均按照規格乘以佔用時間長度計量,詳情請參見計費概述。
說明磁碟中所有目錄可寫,共用磁碟的空間。
磁碟大小與底層執行函數的執行個體生命週期一致,執行個體被系統回收後,磁碟上的資料也會消失。如您需要對檔案進行持久化儲存,可以選擇掛載NAS或OSS。具體操作,請參見配置NAS檔案系統和配置OSSObject Storage Service。
顯存:48 GB
vCPU:8 vCPU
記憶體:64 GB
磁碟:512 MB(不計費,Function Compute提供512 MB的磁碟免費使用額度)
常駐執行個體數
根據常駐資源集區的資源情況為目標函數分配常駐執行個體數。
1
單一實例並發度
您可以為GPU函數配置單一實例多並發,即單個函數執行個體可以同時處理多個請求。具體操作,請參見配置單一實例並發度。
20
函數代碼:配置函數的運行環境和代碼相關資訊。
配置項
說明
樣本
運行環境
使用樣本鏡像:選擇Function Compute提供的樣本鏡像,快速體驗部署鏡像函數。您需要從配置項容器鏡像下方鏡像列表中選擇目標鏡像。
使用ACR中的鏡像:單擊配置項容器鏡像下方的選擇 ACR 中的鏡像,在彈出的選擇容器鏡像面板,選擇已建立的容器鏡像執行個體和ACR 鏡像倉庫,然後在下方選擇鏡像地區找到目標鏡像並在其右側操作列單擊選擇。
說明不支援使用跨賬戶ACR中的公開鏡像建立函數。
請確保您在函數配置中的鏡像在發生任何變化後,及時更新您的函數,否則函數調用會失敗。具體請參見注意事項。
使用企業版執行個體時,只能選擇非加速鏡像,請不要刪除原始鏡像以及加速鏡像,否則會影響函數調用。具體請參見注意事項。
使用企業版執行個體時,不支援自訂網域名格式的鏡像地址。
不支援使用ACR企業版(標準版和進階版)執行個體中開啟僅索引模式鏡像加速的倉庫中的鏡像建立函數。
自ACR新增僅索引模式功能起,企業版(基礎版)執行個體中建立的開啟鏡像加速開關的鏡像倉庫中的鏡像不支援用來建立函數,存量企業版(基礎版)執行個體中存量鏡像加速倉庫中的鏡像仍然支援用來建立函數。關於僅索引模式,請參見按需載入容器鏡像。
容器鏡像
選擇目標鏡像。
SpringBoot Web 應用程式樣本鏡像
啟動命令
程式的啟動命令。如果不配置啟動命令,則預設使用鏡像中的Entrypoint/CMD。
無
監聽連接埠
您的代碼中的HTTP Server所監聽的連接埠。
9000
執行逾時時間
設定逾時時間。執行逾時時間預設為60秒,最長為86400秒。
60
執行個體預熱:AI推理情境,配置執行個體預熱實現模型預熱,解決模型初次請求耗時較長的問題。
配置項
說明
樣本
執行個體預熱
執行個體預熱
通過配置Initializer回調程式,在函數執行個體啟動成功之後,處理請求之前,通過運行指定指令碼或調用介面進行模型載入,提前預熱,最佳化冷啟動。
更多關於Initializer回調程式的介紹,請參見配置執行個體生命週期。
開啟
逾時時間
設定Initializer回調程式逾時時間。
60
預熱程式類型
支援配置執行指令和調用代碼兩種類型的Initializer回調程式實現模型預熱。
執行指令
指令內容
配置執行指令內容。支援使用者自訂Shell實現方式,例如
/bin/bash、/bin/sh、/bin/csh和/bin/zsh等,需要確保函數運行時環境支援對應的Shell實現方式。參見回調方法實現
許可權、網路、儲存:配置函數訪問角色、網路和儲存掛載等。
配置項
說明
樣本
函數角色
Function Compute平台會使用這個RAM角色來產生訪問的阿里雲資源的臨時密鑰,並傳遞給代碼。更多資訊,請參見使用函數角色授予Function Compute訪問其他雲端服務的許可權。
mytestrole
允許訪問 VPC
用於開啟允許函數訪問VPC內資源。更多資訊,請參見配置網路。
開啟
專用網路
允許訪問 VPC選擇是時必填。建立新的VPC或在下拉式清單中選擇要訪問的VPC ID。
fc.auto.create.vpc.1632317****
交換器
允許訪問 VPC選擇是時必填。建立新的交換器或在下拉式清單中選擇交換器ID。
fc.auto.create.vswitch.vpc-bp1p8248****
安全性群組
允許訪問 VPC選擇是時必填。建立新的安全性群組或在下拉式清單中選擇安全性群組。
fc.auto.create.SecurityGroup.vsw-bp15ftbbbbd****
允許預設網卡訪問公網
是否允許函數通過預設網卡訪問公網。
重要使用固定公網IP地址功能時,必須關閉允許函數預設網卡訪問公網,否則配置的固定公網IP地址不生效。更多資訊,請參見配置固定公網IP地址。
開啟
掛載 NAS 檔案系統
為函數配置NAS檔案系統,用於持久化儲存函數間共用資料,例如多個推理函數共用的模型。
如果選擇自動設定,系統預設使用已有名稱為Alibaba-Fc-V3-Component-Generated的通用型NAS檔案系統,如果當前帳號下沒有合格NAS,系統會自動建立。
開啟
掛載 OSS Object Storage Service
為函數掛載OSSObject Storage Service,用於持久化儲存日誌、業務檔案等。具體操作,請參見配置OSSObject Storage Service。
開啟
日誌、鏈路追蹤
配置項
說明
樣本
日誌功能
用於設定將函數的執行日誌持久化儲存到Log Service,方便您進行代碼調試、故障分析和資料分析等。更多資訊,請參見配置日誌功能。
自動設定:自動選擇以
serverless-<region_id>開頭的記錄項目。該記錄項目每個地區僅建立一個,不會重複建立,如系統查詢到當前地區下已有此記錄項目,將直接使用。
自訂配置:需手動指定目標記錄項目和日誌庫。
開啟
更多配置
配置項
說明
樣本
時區
選擇函數的時區。此處設定函數的時區後,將自動為函數添加一條環境變數TZ,其值為設定的目標時區。
UTC
標籤
為函數設定標籤便於分組管理函數,需同時設定標籤鍵和標籤值。
key : value
資源群組
選擇函數所在配置資源群組,使用資源群組對函數進行分組管理。
預設資源群組
環境變數
通過環境變數,在不修改代碼的前提下靈活調整函數的行為,詳見配置環境變數。
{ "BUCKET_NAME": "MY_BUCKET", "TABLE_NAME": "MY_TABLE" }
建立完成後,您可以在函數列表中查看和更新已建立的函數。
更新函數時,只能變更已設定的監聽連接埠,不能刪除或添加額外的監聽連接埠。如果建立函數時,配置了監聽連接埠,更新該函數時,不指定監聽連接埠,將保留建立函數時的監聽連接埠。
使用Serverless Devs建立函數
使用Serverless Devs可以一鍵構建、推送容器鏡像並部署函數。
執行以下命令,初始化專案。
sudo s init根據介面提示,依次選擇阿里雲帳號、自訂鏡像模板和具體的語言(本文以Node.js為例),設定工程名稱、選擇專案部署地區並輸入您的ACR鏡像等。
執行以下命令,進入專案目錄。
cd start-fc3-custom-container-nodejs編輯
s.yaml檔案。關於YAML檔案的參數解釋,請參見YAML規範。樣本如下。
樣本中
image為您的ACR鏡像,需要分別將<your namespace>、<your image>和<your tag>替換為實際的命名空間名稱、鏡像倉庫名稱和鏡像版本。如果您在步驟1初始化專案時已填入正確的ACR鏡像,此處無需修改。edition: 3.0.0 name: hello-world-app # access 是當前應用所需要的密鑰資訊配置: # 密鑰配置可以參考:https://www.serverless-devs.com/serverless-devs/command/config # 密鑰使用順序可以參考:https://www.serverless-devs.com/serverless-devs/tool#密鑰使用順序與規範 access: "default" vars: # 全域變數 region: "cn-hangzhou" resources: hello_world: # 如果只想針對 hello_world 下面的業務進行相關操作,可以在命令列中加上 hello_world,例如: # 只對 hello_world 進行構建:s hello_world build # 如果不帶有 hello_world ,而是直接執行 s build,工具則會對當前Yaml下,所有和 hello_world 平級的業務模組(如有其他平級的模組,例如下面注釋的next_function),按照一定順序進行 build 操作 component: fc3 # 組件名稱 actions: # 自訂執行邏輯 pre-deploy: # 在deploy之前運行 - component: fc3 build --dockerfile ./code/Dockerfile # 要啟動並執行組件,格式為“component: 組件名 命令 參數” props: region: ${vars.region} # 關於變數的使用方法,可以參考:https://docs.serverless-devs.com/serverless-devs/yaml#%E5%8F%98%E9%87%8F%E8%B5%8B%E5%80%BC functionName: "start-nodejs-ufrz" runtime: "custom-container" description: 'hello world by serverless devs' timeout: 30 memorySize: 512 cpu: 0.5 diskSize: 512 code: ./code customContainerConfig: image: 'registry.${vars.region}.aliyuncs.com/<your namespace>/<your image>:<your tag>' # 您的ACR鏡像,需要分別將<your namespace>、<your image>和<your tag>替換為實際的命名空間名稱、鏡像倉庫名稱和鏡像版本 # triggers: # - triggerName: httpTrigger # 觸發器名稱 # triggerType: http # 觸發器類型 # description: 'xxxx' # qualifier: LATEST # 觸發服務的版本 # triggerConfig: # authType: anonymous # 鑒權類型,可選值:anonymous、function # disableURLInternet: false # 是否禁用公網存取 URL # methods: # HTTP 觸發器支援的存取方法,可選值:GET、POST、PUT、DELETE、HEAD # - GET # - POST執行以下命令,部署專案。
sudo s deploy輸出樣本:
Steps for [deploy] of [hello-world-app] ==================== DEPRECATED: The legacy builder is deprecated and will be removed in a future release. BuildKit is currently disabled; enable it by removing the DOCKER_BUILDKIT=0 environment-variable. Sending build context to Docker daemon 5.12kB Step 1/7 : FROM node:14-buster 14-buster: Pulling from library/node 2ff1d7c41c74: Already exists b253aeafeaa7: Already exists 3d2201bd995c: Already exists 1de76e268b10: Already exists d9a8df589451: Already exists 6f51ee005dea: Already exists 5f32ed3c3f27: Already exists 0c8cc2f24a4d: Already exists 0d27a8e86132: Already exists Digest: sha256:a158d3b9b4e3fa813fa6c8c590b8f0a860e015ad4e59bbce5744d2f6fd8461aa Status: Downloaded newer image for node:14-buster ---> 1d12470fa662 Step 2/7 : WORKDIR /usr/src/ ---> Running in 70a8e2e4d1ea Removing intermediate container 70a8e2e4d1ea ---> 0d67b8fa2901 Step 3/7 : COPY package*.json ./ ---> 09eb15f8770a Step 4/7 : RUN npm install ---> Running in 8ae492be973b Step 5/7 : COPY . . ---> 7560c7b14431 Step 6/7 : EXPOSE 9000 ---> Running in 66b38e54ced0 Removing intermediate container 66b38e54ced0 ---> f73cce48d2ae Step 7/7 : ENTRYPOINT [ "node", "server.js" ] ---> Running in 2fb2f83fd6c0 Removing intermediate container 2fb2f83fd6c0 ---> fe51ae71448c Successfully built fe51ae71448c Successfully tagged registry.cn-hangzhou.aliyuncs.com/z****/z****:latest [2024-01-29 16:33:06][INFO][hello_world] get instanceName= and region=cn-hangzhou from registry.cn-hangzhou.aliyuncs.com/z****/z**** [2024-01-29 16:33:06][INFO][hello_world] try to docker push registry.cn-hangzhou.aliyuncs.com/z****/z**** ... WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded Using default tag: latest The push refers to repository [registry.cn-hangzhou.aliyuncs.com/z****/z****] 85c1ec915b45: Pushed 37c36543a431: Pushed e4afd7f70434: Pushed 0d5f5a015e5d: Layer already exists 3c777d951de2: Layer already exists f8a91dd5fc84: Layer already exists cb81227abde5: Layer already exists e01a454893a9: Layer already exists c45660adde37: Layer already exists fe0fb3ab4a0f: Layer already exists f1186e5061f2: Layer already exists b2dba7477754: Layer already exists latest: digest: sha256:6bf1ed4119d197a46c99082577632957056cb625f2ee0276d2af53f60d22837d size: 2841 [hello_world] completed (688.45s) Result for [deploy] of [hello-world-app] ==================== region: cn-hangzhou cpu: 0.5 customContainerConfig: image: registry.cn-hangzhou.aliyuncs.com/z****/z**** resolvedImageUri: registry.cn-hangzhou.aliyuncs.com/z****/z****@sha256:6bf1ed4119d197a46c99082577632957056cb625f2ee0276d2af53f60d22837d description: hello world by serverless devs diskSize: 512 functionName: start-nodejs-ufrz handler: handler instanceConcurrency: 1 internetAccess: true lastUpdateStatus: Successful memorySize: 512 role: runtime: custom-container state: Active timeout: 30 A complete log of this run can be found in: /root/.s/logs/0129162246執行以下命令,調試函數。
sudo s invoke -e "{\"key\":\"val\"}"輸出樣本:
Steps for [invoke] of [hello-world-app] ==================== ========= FC invoke Logs begin ========= FC Invoke Start RequestId: 1-65b764db-15eb737f-0c67ab5cd968 FC Invoke Start RequestId: 1-65b764db-15eb737f-0c67ab5cd968 hello world! FC Invoke End RequestId: 1-65b764db-15eb737f-0c67ab5cd968 Duration: 42.27 ms, Billed Duration: 43 ms, Memory Size: 512 MB, Max Memory Used: 47.77 MB ========= FC invoke Logs end ========= Invoke instanceId: c-65b764db-15fa2aa8-bc50f7839399 Code Checksum: undefined Qualifier: LATEST RequestId: 1-65b764db-15eb737f-0c67ab5cd968 Invoke Result: OK [hello_world] completed (4.96s) A complete log of this run can be found in: /root/.s/logs/0129164202
相關文檔
使用自訂鏡像函數,容器鏡像依賴的基礎環境會帶來額外的資料下載和解壓的時間,為了降低冷啟動時間,請參見Function Compute冷啟動最佳化最佳實務。
您也可以調用API來建立函數,更多資訊,請參見CreateFunction - 建立函數。
關於Function Compute提供的內建運行時、自訂運行時和自訂鏡像運行時適用情境及差異,請參見函數運行時選型。