使用ARM架構資源部署容器通常可以節省不少成本,但也可能導致維護成本增加,您可能需要面向x86、ARM架構分別構建鏡像並設定不同的Tag。通過ACR控制台配置的多架構構建任務可以協助您簡化這一過程,您可以通過一個Tag來管理多種架構的鏡像。
前提條件
建立Container Registry企業版執行個體。具體操作,請參見建立企業版執行個體。
繫結來源代碼託管平台。具體操作,請參見繫結來源代碼託管平台。
代碼工程支援在目標架構上構建。
背景資訊
當僅選擇一種架構時,構建推送後的Tag中只包含該架構的鏡像。
當同時選擇多個架構時,構建系統會將多個架構的鏡像以同一Tag的形式推送到鏡像倉庫。Docker、Containerd等用戶端在鏡像拉取過程中會根據用戶端架構拉取遠端鏡像倉庫內指定架構鏡像。
支援的具體架構如下表所示:
作業系統 | 架構 | 是否支援 |
Linux | amd64 | 支援(為預設架構) |
Linux | arm64 | 支援 |
Linux | arm/v7 | 支援 |
Linux | arm/v6 | 支援 |
Windows | amd64 | 暫不支援 |
步驟一:確定代碼工程
確定需要進行鏡像構建的代碼倉庫。作為示範,您可以選擇使用下面的GoLang檔案和Dockerfile檔案來構造您的工程。
// 儲存為 hello.go
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Printf("Hello, %s!\n", runtime.GOARCH)
}
FROM golang:alpine AS builder
RUN mkdir /app
ADD . /app/
WORKDIR /app
RUN go build -o hello hello.go
FROM alpine
RUN mkdir /app
WORKDIR /app
COPY --from=builder /app/hello .
CMD ["./hello"]
步驟二:建立鏡像倉庫
建立鏡像倉庫,並綁定代碼倉庫,此代碼倉庫觸發的鏡像構建都會推送到該鏡像倉庫下。
在頂部功能表列,選擇所需地區。
在左側導覽列,選擇執行個體列表。
在執行個體列表頁面單擊目標企業版執行個體。
在企業版執行個體管理頁面選擇 。
- 在鏡像倉庫單擊建立鏡像倉庫。
在倉庫資訊設定精靈中設定命名空間、倉庫名稱、倉庫類型、鏡像版本、鏡像加速、摘要、描述資訊,單擊下一步。
在代碼源設定精靈中設定代碼源、構建設定、構建規則設定,單擊建立鏡像倉庫。
參數
說明
代碼源
選擇代碼源。
構建設定
代碼變更時自動構建鏡像:當分支有代碼提交後會自動觸發構建規則。
海外源智能加速:構建時會在海外機房構建,構建成功後推送到指定地區。如果您專案的Dockerfile檔案需要從國外網站下載檔案,但是跨境網路不穩定,您可以使用海外源智能加速。
不使用緩衝:每次構建鏡像時會強制重新拉取基礎依賴鏡像。開啟不使用緩衝,可能會增加鏡像的構建時間。
在鏡像倉庫頁面單擊目標鏡像倉庫,您可以在鏡像倉庫管理頁面左側導覽列看到構建,說明鏡像倉庫和原始碼倉庫綁定成功。
步驟三:建立構建規則並選擇目標架構
作為示範,在構建配置時,本文所選擇的構建架構為linux/amd64和linux/arm64。
在頂部功能表列,選擇所需地區。
在左側導覽列,選擇執行個體列表。
在執行個體列表頁面單擊目標企業版執行個體。
在企業版執行個體管理頁面選擇 。
在鏡像倉庫頁面單擊目標倉庫右側操作列中的管理。
單擊左側導覽列中的構建,在構建規則設定地區單擊添加規則,在構建資訊設定精靈中設定參數,然後單擊下一步。
參數
說明
類型
設定原始碼倉庫的類型,可以是Branch或Tag。
Branch/Tag
選擇或者填寫Branch/Tag,支援正則規則。當正則規則為release-(?<imageTag>\w*)時,將識別release-v1原始碼變更並自動構建版本為v1的鏡像(不支援立即構建),更多資訊,請參見附錄:Regex-命名擷取的群組。
說明設定正則規則後僅支援系統自動構建,不支援手動立即構建。
Dockerfile目錄
設定Dockerfile檔案所在的目錄。指的是相對目錄,以Branch/Tag的根目錄為父目錄,例如您的Branch為master,您的Dockerfile檔案放在master下,則您的Dockerfile目錄為/。
Dockerfile檔案名稱
設定Dockerfile檔案名稱,預設為Dockerfile。
在鏡像版本設定精靈中設定參數,單擊儲存,然後單擊下一步。
說明單擊新增配置,可以增加鏡像版本,最多可以設定3個鏡像版本。
參數
說明
鏡像版本
設定鏡像Tag,例如latest。支援命名捕獲,例如使用Branch/Tag中捕獲的內容。
時間
推送原始碼的東八區(UTC+8)時間,有兩種格式可供選擇,例如20201015和202010151613。
說明該參數為可選項,當選中該參數後系統僅支援自動構建,不支援手動立即構建。
Commit ID
最近一次推送代碼的Commit ID,預設取前6位,可以滑動下方的滑塊設定位元。
說明該參數為可選項,當選中該參數後系統僅支援自動構建,不支援手動立即構建。
在構建配置設定精靈中設定構建參數,然後單擊確定。
參數
說明
構建架構
選擇構建架構,支援並行構建,最終形成一個鏡像版本對應多個架構鏡像。
構建參數
鏡像構建運行時參數,構建參數由區分大小寫索引值對組成,您最多可以設定20個構建參數。您可以設定構建參數,該構建參數會修改Dockerfile檔案中環境變數,使同一個Dockerfile檔案呈現多種狀態。
觸發構建規則。
您可以通過以下兩種方式觸發構建規則:
在構建頁面構建規則設定地區單擊目標構建規則操作列下的立即構建,觸發構建規則。
向代碼倉庫的master分支提交代碼,觸發構建規則。
說明在構建頁面構建日誌地區單擊目標構建任務操作列的取消,可以取消構建任務。
在構建頁面構建日誌地區單擊目標構建任務操作列的日誌,可以查看構建過程日誌。
在左側導覽列單擊鏡像版本,您可以看到構建的鏡像,說明構建鏡像成功。
步驟四:驗證構建結果
構建完成後,在目標倉庫的配置頁面,單擊左側導覽列中鏡像版本,查看產生的目標版本鏡像。
可以看到main版本下有linux/amd64和linux/arm64兩個架構的鏡像。
在linux/amd64和linux/arm64架構上分別驗證鏡像。
在linux/amd64機器上執行以下命令。
docker run --rm xxx-registry.cn-hangzhou.cr.aliyuncs.com/test/golang-test:main
預期輸出:
Hello, amd64!
在linux/arm64機器上執行以下命令。
docker run --rm xxx-registry.cn-hangzhou.cr.aliyuncs.com/test/golang-test:main
預期輸出:
Hello, arm!
可以看到在不同架構的機器上,都可以使用構建的鏡像。
附錄:Regex-命名擷取的群組
命名擷取的群組
擷取的群組就是把Regex中子運算式匹配的內容,儲存到記憶體中以數字編號或顯式命名的組裡,方便後面引用。當然,這種引用既可以是在Regex內部,也可以是在Regex外部。擷取的群組有兩種形式,一種是普通擷取的群組,另一種是命名擷取的群組,本文簡單介紹命名擷取的群組。
命名擷取的群組的一般形式如下:
(?<name>Expression)
您可以使用命名擷取的群組將release-11-2-10轉換成11.2.10,相應的Regex如下:
release-(?<major>\d*)-(?<minor>\d*)-(?<version>\d*)
當release-11-2-10匹配到這個Regex後,會自動把相應位置匹配到的子運算式內容存放到major、minor和version這三個組中,然後我們就可以使用下面的模板產生11.2.10這個字串了。
${major}.${minor}.${version}
相關文檔
若您希望在本地構建多架構的容器鏡像,請參見本地構建和推送多架構鏡像到Container Registry。