docker registry api v2 支持多 CPU 架構鏡像.linux
同時 harbor v2 也實現了 docker registry api v2 的支持.git
實現以後, 將再也不有 cpu 架構困擾, 一個 docker pull image:tag
將自動適配可適配的平臺。真正作到海納百川,一騎當千。github
因爲 binfmt_misc 機制開啓須要依賴 Linux kernel >= 4.8 。所以,在對 linux 系統操做選型上有必定要求。docker
建議使用 發行版 出場內核已經知足需求的操做系統。而不是選擇本身升級系統內核。json
參考文章:ubuntu
當前 buildx 仍是一個實驗模式, 如須要支持, 須要進行以下配置c#
# vi /etc/docker/daemon.json { "experimental": true }
# https://github.com/docker/buildx/blob/master/README.md#docker-ce BUILDX_VERSION=v0.4.1 ARCH=$(uname -m) [ "${ARCH}" == "x86_64" ] && ARCH=amd64 [ "${ARCH}" == "aarch64" ] && ARCH=arm64 mkdir -p ~/.docker/cli-plugins wget -c https://github.com/docker/buildx/releases/download/${BUILDX_VERSION}/buildx-${BUILDX_VERSION}.linux-${ARCH} -O docker-buildx\ && chmod +x docker-buildx \ && mv docker-buildx ~/.docker/cli-plugins/
下載並安裝 qumu 到 /usr/bin/qemu-$(uname -m)-staticapi
# https://github.com/multiarch/qemu-user-static#multiarchqemu-user-static-images QEMU_VERSION=v5.0.0-2 wget -c https://github.com/multiarch/qemu-user-static/releases/download/${QEMU_VERSION}/qemu-$(uname -m)-static -O qemu-$(uname -m)-static \ && chmod +x qemu-$(uname -m)-static \ && mv qemu-$(uname -m)-static /usr/local/bin/qemu-$(uname -m)-static
## 1. 建立指定名稱及指定平臺的builder docker buildx create --use --platform=linux/amd64,linux/arm64 --name localbuilder ### 建立隨機名稱的 默認參數 builder # docker buildx create --use
目錄結構以下架構
# tree # . # ├── alpine-bake # │ └── alpine.Dockerfile # └── bake.hcl
FROM alpine:3.12 ARG TARGETARCH RUN echo "TARGETARCH is $TARGETARCH"
group "default" { targets = ["alpine"] } target "alpine" { context = "./alpine-bake" dockerfile = "alpine.Dockerfile" tags = ["docker.io/tangx/alpine:buildx-bake-hcl"] platforms = ["linux/amd64", "linux/arm64", "linux/arm/v6", "linux/arm/v7", "linux/s390x"] ## push to registry output = ["type=registry"] ## pull base image always pull = true } target "debian" { context = "./debian-bake" ## default: Dockerfile # dockerfile = "Dockerfile" tags = ["docker.io/tangx/debian:buildx-bake-hcl"] platforms = ["linux/amd64", "linux/arm64", "linux/arm/v6", "linux/arm/v7", "linux/s390x"] ## push to registry output = ["type=registry"] ## pull base image always pull = true }
docker buildx bake -f bake.hcl # -f alias to bake
當命令中省略 -f 參數時, 默認 bake 文件爲:dom
能夠在 tangx/alpine:buildx-bake-hcl 看到,生成的鏡像, 支持了 5個 cpu 架構。
# docker buildx bake -f bake.hcl [+] Building 46.9s (19/19) FINISHED => [internal] booting buildkit 3.3s => [internal] load build definition from alpine.Dockerfile 0.1s => [internal] load .dockerignore 0.1s => [linux/arm/v6 internal] load metadata for docker.io/library/alpine:3.12 13.1s => [linux/arm64 internal] load metadata for docker.io/library/alpine:3.12 10.4s => [linux/amd64 internal] load metadata for docker.io/library/alpine:3.12 13.1s => [linux/s390x internal] load metadata for docker.io/library/alpine:3.12 13.1s => [linux/arm/v7 internal] load metadata for docker.io/library/alpine:3.12 13.1s => [linux/amd64 1/2] FROM docker.io/library/alpine:3.12@sha256:c0e9560cda118f9ec63ddefb4a173a2b2a0347082d7dff7dc14272e7841a5b5a 6.1s => [linux/arm/v7 1/2] FROM docker.io/library/alpine:3.12@sha256:c0e9560cda118f9ec63ddefb4a173a2b2a0347082d7dff7dc14272e7841a5b5a 5.9s => [linux/arm/v6 1/2] FROM docker.io/library/alpine:3.12@sha256:c0e9560cda118f9ec63ddefb4a173a2b2a0347082d7dff7dc14272e7841a5b5a 6.0s => [linux/arm64 1/2] FROM docker.io/library/alpine:3.12@sha256:c0e9560cda118f9ec63ddefb4a173a2b2a0347082d7dff7dc14272e7841a5b5a 6.1s => [linux/s390x 1/2] FROM docker.io/library/alpine:3.12@sha256:c0e9560cda118f9ec63ddefb4a173a2b2a0347082d7dff7dc14272e7841a5b5a 6.3s => [linux/arm/v7 2/2] RUN echo "TARGETARCH is arm" 0.9s => [linux/arm/v6 2/2] RUN echo "TARGETARCH is arm" 0.8s => [linux/amd64 2/2] RUN echo "TARGETARCH is amd64" 0.7s => [linux/arm64 2/2] RUN echo "TARGETARCH is arm64" 0.5s => [linux/s390x 2/2] RUN echo "TARGETARCH is s390x" 0.4s => exporting to image 22.9s
# docker buildx build --platform=linux/amd64,linux/arm64 --file alpine-bake/alpine.Dockerfile --tag tangx/alpine:multi-arch --push alpine-bake/
略
2 . buildx bake
3 .docker
global platform args
type Target struct { Name string `json:"-" hcl:"name,label"` // Inherits is the only field that cannot be overridden with --set Inherits []string `json:"inherits,omitempty" hcl:"inherits,optional"` Context *string `json:"context,omitempty" hcl:"context,optional"` Dockerfile *string `json:"dockerfile,omitempty" hcl:"dockerfile,optional"` Args map[string]string `json:"args,omitempty" hcl:"args,optional"` Labels map[string]string `json:"labels,omitempty" hcl:"labels,optional"` Tags []string `json:"tags,omitempty" hcl:"tags,optional"` CacheFrom []string `json:"cache-from,omitempty" hcl:"cache-from,optional"` CacheTo []string `json:"cache-to,omitempty" hcl:"cache-to,optional"` Target *string `json:"target,omitempty" hcl:"target,optional"` Secrets []string `json:"secret,omitempty" hcl:"secret,optional"` SSH []string `json:"ssh,omitempty" hcl:"ssh,optional"` Platforms []string `json:"platforms,omitempty" hcl:"platforms,optional"` Outputs []string `json:"output,omitempty" hcl:"output,optional"` Pull *bool `json:"pull,omitempty" hcl:"pull,optional"` NoCache *bool `json:"no-cache,omitempty" hcl:"no-cache,optional"` // IMPORTANT: if you add more fields here, do not forget to update newOverrides and README. }
https://github.com/marketplace/actions/customizable-docker-buildx
當前模式不支持 buildx : https://github.com/docker/cli/blob/master/experimental/README.md
# 開始實驗模式 # ~/docker/daemon.json { "experimental": true } # docker version -f '' ## true
# 建立一個 builder docker buildx create --use # a random name docker buildx create --user --name specified_name # specified name
$ uname -m x86_64 $ docker run --rm -t arm64v8/ubuntu uname -m standard_init_linux.go:211: exec user process caused "exec format error" $ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes $ docker run --rm -t arm64v8/ubuntu uname -m aarch64