使用ARM架構資源部署容器通??梢怨澥〔簧俪杀?,但也可能導致維護成本增加,您可能需要面向x86、ARM架構分別構建鏡像并設置不同的Tag。通過ACR控制臺配置的多架構構建任務可以幫助您簡化這一過程,您可以通過一個Tag來管理多種架構的鏡像。
前提條件
背景信息
當僅選擇一種架構時,構建推送后的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的鏡像(不支持立即構建),更多信息,請參見附錄:正則表達式-命名捕獲組。
說明設置正則規則后僅支持系統自動構建,不支持手動立即構建。
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!
可以看到在不同架構的機器上,都可以使用構建的鏡像。
附錄:正則表達式-命名捕獲組
命名捕獲組
捕獲組就是把正則表達式中子表達式匹配的內容,保存到內存中以數字編號或顯式命名的組里,方便后面引用。當然,這種引用既可以是在正則表達式內部,也可以是在正則表達式外部。捕獲組有兩種形式,一種是普通捕獲組,另一種是命名捕獲組,本文簡單介紹命名捕獲組。
命名捕獲組的一般形式如下:
(?<name>Expression)
您可以使用命名捕獲組將release-11-2-10轉換成11.2.10,相應的正則表達式如下:
release-(?<major>\d*)-(?<minor>\d*)-(?<version>\d*)
當release-11-2-10匹配到這個正則表達式后,會自動把相應位置匹配到的子表達式內容存放到major、minor和version這三個組中,然后我們就可以使用下面的模板生成11.2.10這個字符串了。
${major}.${minor}.${version}
相關文檔
若您希望在本地構建多架構的容器鏡像,請參見本地構建和推送多架構鏡像到容器鏡像服務。