Docker buildx: 一口氣 build 跨架構 image



前言

  • 為了 EC2 搬家、改用 ARM64 架構,原有的 image 都要重新 build,而且要同時支援 AMD64ARM64
  • 本篇簡單紀錄 docker buildx 的使用方式。



說明

安裝方式

如果你是依照官網的文件做的話,在安裝 docker 的時候,應該已經有安裝了。

例如 CentOS [2]

如果沒有的話,就手動安裝:

1
2
3
4
5
6
7
8
# centos
yum install docker-buildx-plugin

# ubuntu
apt install docker-buildx-plugin

# mac
brew install docker-buildx

先登入

建議使用 docker hub 的 token 來登入,不要用自己的密碼。

一方面 token 複雜度通常都比密碼高,另一方面,隨時可以依照需求 expire 它。

產生方式:

My Account -> Security -> New Access Token

按下 Generate 之後複製好你的 token,這就是登入要用的密碼。


1
2
docker login -u ${YOUR_DOCKER_ID}
# 然後輸入 token

build!

之前可以先 build 再 push;但多架構的話,一定要先有一個 builder,然後 build 跟 push 一氣呵成:

1
2
3
4
5
# Note
docker buildx create --use

# 一氣呵成
docker buildx build --push --platform linux/amd64,linux/arm64 -t ${IMAGE_NAME}  .
  • ${IMAGE_NAME} 範例:ktlast/my-best-api:latest
  • 如果你也是用 docker hub automatic build,只要給 literally ${IMAGE_NAME} 他會自己幫你套用變數。

Note

  1. 如果在自己的電腦上,builder 只需要建立一次。所以以上面的指令來說,如果有好幾個 image 要 build,之後只需要跑第 2 行即可。

  2. 切換 builder:

    1
    2
    
    docker buildx ls
    docker buildx use ${BUILDER_NAME}
    
  3. 我是在 CI 上面跑,所以腳本直接無腦寫、每次都執行。

  4. 因為我只需要 amd64 以及 arm64,如果有其他架構,可以自行加入。

    查看所有支援的架構:

    1
    2
    3
    4
    
    docker buildx inspect | grep Platforms
    
    # output
    Platforms: linux/arm64, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/arm/v7, linux/arm/v6
    



REF

  1. https://blog.jks.coffee/docker-multi-architecture-build/
  2. https://docs.docker.com/engine/install/centos/
  3. https://stackoverflow.com/questions/75452542/how-to-install-buildx-with-docker-23-0-1

主題 StackJimmy 設計