多多益善|基於Artifactory和Buildx構建多架構Docker映象

JFrog傑蛙科技發表於2021-09-22

一、背景


在業界當前的雲原生實踐中,“構建一次,隨處部署”的機制已經得到了普遍應用。藉助容器化和Docker,我們可以為任何環境構建應用和服務,並在執行時再設定配置。

不過,這種適應性還是有一些限制。作業系統和應用程式仍然需要編譯才能在特定的架構型別上執行。例如,為AMD64處理器編譯的軟體不能在基於ARM的機器上執行,為 Linux構建的軟體也不能在Windows上執行。

Docker透過支援多架構(multi-arch)映象滿足了容器應用的多CPU架構的需求。您可以為需要支援的每個架構構建單獨的映象,然後作為一個集合將所有映象繫結在Docker清單的列表中。然後,您可以透過其名稱和標籤部署生成的多架構映象——Docker客戶端將自動選擇與目標架構匹配的映象。

基於Artifactory的Docker倉庫可以很方便地構建多架構映象,而且可以像管理其他任何Docker映象一樣來管理這些多架構映象。本文我們將向您展示如何在開發/交付流程流程中來建立和管理多架構Docker映象。


二、構建多架構映象

多架構映象

在本文的例子中,我們需要建立一個應用程式,必須能夠在Linux 作業系統下如下的兩種處理器架構上執行:

  1. x86-64環境,例如 Linux 桌面;
  2. AWS EC2上基於ARM的A1 例項。

為了能夠在任何一個上執行,我們需要一個支援amd64和arm64架構的多架構映象。


  • 基於Buildx建立多架構映象

首先,我們的DockerFile必須配置為根據所需的架構來建立示例映象,如下所示:

ARG ARCH=

FROM ${ARCH}debian:buster-slim


RUN apt-get update \

&& apt-get install - y curl \

&& rm -rf /var/lib/apt/lists/*

ENTRYPOINT [ “curl” ]


如果我們使用這個DockerFile執行docker build命令,並使用--build-arg選項來設定ARCH引數,我們可以為每個所需的架構構建一個獨立的映象。然後我們需要構建一個單獨的清單列表(使用docker manifest命令)將它們繫結到一個多架構映象中。

除此之外,還有一種更簡單、更推薦的方法。使用Docker CLI的Buildx外掛(參見 docs.docker.com/buildx/ ),您可以直接建立一個多架構映象,並利用同一條Docker CLI命令列將構建好的多架構映象推送到Artifactory中的Docker倉庫裡。如下所示:

$ docker buildx build \

--push \

--platform linux/amd64,linux/arm64 \

--output=type=image,push=true,registry.insecure=true \

--tag myartifactory/docker-local /multiarch-image:tag .


如果您使用的是Mac或Windows上的Docker Desktop,那麼Buildx已經隨著裝好了。如果您使用的是Linux,則可以從GitHub安裝Buildx。

(參見 github.com/docker/build


  • Artifactory裡的多架構映象

以下是上一節建立的multiarch-image多架構映象在Artifactory中的儲存方式,該映象儲存在名為docker-local的Docker倉庫中。

多多益善|基於Artifactory和Buildx構建多架構Docker映象


► Docker清單列表

Docker生成的清單列表(list.manifest.json)是多架構映象“映象清單的清單”,也稱為“富清單”,它標識了集合中的 Docker 映象以及每個映象要執行的架構(作業系統和處理器組合)。

多多益善|基於Artifactory和Buildx構建多架構Docker映象

當multiarch-image應用執行時,Docker CLI將首先拉取清單列表,然後使用它來選擇拉取和部署哪個映象,以匹配目標地的作業系統和架構。


► 架構映象

每個被支援架構的映象都有自己的標籤,可以透過它來定址,這個標籤是Artifactory透過組合釋出標籤和架構名稱來建立的。由於我們的示例使用釋出標籤“tag”,因此架構映象的標籤是tag-linux-amd64和tag-linux-arm64。

每個映象也有自己的清單,用於標識組成它的層。

多多益善|基於Artifactory和Buildx構建多架構Docker映象


三、晉級多架構映象

一旦您的多架構映象位於Artifactory的Docker倉庫並透過了測試,您就可以將該映象晉級到下一個成熟度的Docker倉庫,就像其他任何型別的製品倉庫一樣。

如下的JFrog CLI命令將我們在docker-local倉庫中建立的多架構映像晉級到docker-target倉庫中:

$ jfrog rt docker-promote --copy \

multiarch-image docker-local docker-target

與任何通常的Docker映象一樣,您也可以將晉級限制為映象中的某個標籤。如果您選擇在晉級中重新命名標籤,它將為多架構映象中的每個架構重新命名。命令如下:

$ jfrog rt docker-promote --copy \

--source-tag “latest” --target-tag “latest-new” \

multiarch-image docker-local docker-target


四、總結


在整個軟體開發生命週期(SDLC)中交付多架構映象可能意味著更復雜的測試和驗證,因為每個受支援的架構都可能需要在其目標平臺上單獨驗證。

但是透過 Artifactory 對多架構映象的支援,您工作流程的最佳實踐將得以保留。您仍然可以只構建一次,然後在開發、測試和生產階段晉級您的不可變、多架構映象。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69954434/viewspace-2793052/,如需轉載,請註明出處,否則將追究法律責任。

相關文章