Buildx
前提环境
- 系统: Windows 11 专业版 22H2
- Docker Desktop 4.8.2 (79419)
- wsl2 ubuntu 22.04
要想使用 buildx
,首先要确保 Docker 版本不低于 19.03
,同时还要通过设置环境变量 DOCKER_CLI_EXPERIMENTAL
来启用。可以通过下面的命令来为当前终端启用 buildx 插件:
export DOCKER_CLI_EXPERIMENTAL=enabled
验证版本
chq@chq:~/buildx-test$ docker --version
Docker version 20.10.14, build a224086
如果在某些系统上设置环境变量 DOCKER_CLI_EXPERIMENTAL
不生效(比如 Arch Linux),你可以选择从源代码编译:
export DOCKER_BUILDKIT=1
docker build --platform=local -o . git://github.com/docker/buildx
mkdir -p ~/.docker/cli-plugins && mv buildx ~/.docker/cli-plugins/docker-buildx
启用 binfmt_misc
如果你使用的是 Docker 桌面版(MacOS 和 Windows),默认已经启用了 binfmt_misc
,可以跳过这一步。
验证是 binfmt_misc 否开启:
chq@chq:~/buildx-test$ ls -al /proc/sys/fs/binfmt_misc/
total 0
drwxr-xr-x 2 root root 0 Jul 7 14:51 .
dr-xr-xr-x 1 root root 0 Jul 7 14:51 ..
-rw-r--r-- 1 root root 0 Jul 7 14:51 WSLInterop
-rw-r--r-- 1 root root 0 Jul 11 15:46 qemu-aarch64
-rw-r--r-- 1 root root 0 Jul 11 15:46 qemu-arm
-rw-r--r-- 1 root root 0 Jul 11 15:46 qemu-mips64
-rw-r--r-- 1 root root 0 Jul 11 15:46 qemu-mips64el
-rw-r--r-- 1 root root 0 Jul 11 15:46 qemu-ppc64le
-rw-r--r-- 1 root root 0 Jul 11 15:46 qemu-riscv64
-rw-r--r-- 1 root root 0 Jul 11 15:46 qemu-s390x
--w------- 1 root root 0 Jul 7 14:51 register
-rw-r--r-- 1 root root 0 Jul 7 14:51 status
从默认的构建器切换到多平台构建器
Docker 默认会使用不支持多 CPU 架构的构建器,我们需要手动切换。
先创建一个新的构建器:
chq@chq:~/buildx-test$ docker buildx create --use --name mybuild
mybuild
启动构建器:
chq@chq:~/buildx-test$ docker buildx inspect mybuild --bootstrap
[+] Building 41.7s (1/1) FINISHED
=> [internal] booting buildkit 41.7s
=> => pulling image moby/buildkit:buildx-stable-1 40.8s
=> => creating container buildx_buildkit_mybuild0 0.8s
Name: mybuild
Driver: docker-container
Nodes:
Name: mybuild0
Endpoint: unix:///var/run/docker.sock
Status: running
Platforms: linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
查看当前使用的构建器及构建器支持的 CPU 架构,可以看到支持很多 CPU 架构:
chq@chq:~/buildx-test$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
mybuild * docker-container
mybuild0 unix:///var/run/docker.sock running linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
desktop-linux protocol not available
default docker
default default running linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
测试编译镜像
构建前准备源文件,并编写Dockerfile文件
hello.go文件:
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Printf("Hello, %s!\n", runtime.GOARCH)
}
Dockerfile文件:
FROM golang:alpine AS builder
RUN mkdir /app
ADD . /app/
WORKDIR /app
RUN go mod init hello
RUN go build -o hello .
FROM alpine
RUN mkdir /app
WORKDIR /app
COPY --from=builder /app/hello .
CMD ["./hello"]
使用buildx进行交叉编译:
chq@chq:~/buildx-test$ sudo docker buildx build -t chq/hello-arch --platform=linux/arm64 -o type=docker .
[sudo] password for chq:
[+] Building 33.5s (14/16)
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 245B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/alpine:latest 16.2s
=> [internal] load metadata for docker.io/library/golang:alpine 1.6s
=> [builder 1/6] FROM docker.io/library/golang:alpine@sha256:4918412049183afe42f1ecaf8f5c2a88917c2eab153ce5ecf4 17.3s
=> => resolve docker.io/library/golang:alpine@sha256:4918412049183afe42f1ecaf8f5c2a88917c2eab153ce5ecf4bf2d55c15 0.0s
=> => sha256:4918412049183afe42f1ecaf8f5c2a88917c2eab153ce5ecf4bf2d55c1507b74 1.65kB / 1.65kB 0.0s
=> => sha256:4e6ba1f23bdaa946184b3a88627b69f1c55436b4fc6f42eb80a1e3cfa92e53c9 1.36kB / 1.36kB 0.0s
=> => sha256:939b513d7ff818b7dbf6602c8c82e3616a5c322d170ec228aef1b7b2d4036f00 5.21kB / 5.21kB 0.0s
=> => sha256:9b3977197b4f2147bdd31e1271f811319dcd5c2fc595f14e81f5351ab6275b99 2.10MB / 2.72MB 17.2s
=> => sha256:1a89e8eeedd549875510e5e4e14010906a58878526814e6df25d14009856c6ff 281.90kB / 281.90kB 0.6s
=> => sha256:94645a83ff95687e6f078c140cfcac8def006923ed4019ef74fa189e6d9f0b14 153B / 153B 0.7s
=> => sha256:52f1d2cc2047096fccb9e9c98a434c2b4673cde748c1a935baaef4e1a3113c49 104.37MB / 104.37MB 10.2s
=> => sha256:c79ebd5bc6f15dff169efe2a6f424f776b67bdef8c956da543bd768ca7262f85 126B / 126B 1.2s
=> => extracting sha256:9b3977197b4f2147bdd31e1271f811319dcd5c2fc595f14e81f5351ab6275b99 0.2s
=> => extracting sha256:1a89e8eeedd549875510e5e4e14010906a58878526814e6df25d14009856c6ff 0.1s
=> => extracting sha256:94645a83ff95687e6f078c140cfcac8def006923ed4019ef74fa189e6d9f0b14 0.0s
=> => extracting sha256:52f1d2cc2047096fccb9e9c98a434c2b4673cde748c1a935baaef4e1a3113c49 2.9s
=> => extracting sha256:c79ebd5bc6f15dff169efe2a6f424f776b67bdef8c956da543bd768ca7262f85 0.0s
=> [stage-1 1/4] FROM docker.io/library/alpine@sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70f 17.3s
=> => resolve docker.io/library/alpine@sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c9300 0.0s
=> => sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c9300 1.64kB / 1.64kB 0.0s
=> => sha256:c74f1b1166784193ea6c8f9440263b9be6cae07dfe35e32a5df7a31358ac2060 528B / 528B 0.0s
=> => sha256:8e1d7573f448dc8d0ca13293b1768959a2528ff04be704f1f3d35fd3dbf6da3d 1.49kB / 1.49kB 0.0s
=> => sha256:9b3977197b4f2147bdd31e1271f811319dcd5c2fc595f14e81f5351ab6275b99 2.72MB / 2.72MB 0.8s
=> => extracting sha256:9b3977197b4f2147bdd31e1271f811319dcd5c2fc595f14e81f5351ab6275b99 0.2s
=> [internal] load build context 0.0s
=> => transferring context: 392B 0.0s
=> [stage-1 2/4] RUN mkdir /app 0.5s
=> [stage-1 3/4] WORKDIR /app 0.0s
=> [builder 2/6] RUN mkdir /app 0.6s
=> [builder 3/6] ADD . /app/ 0.0s
=> [builder 4/6] WORKDIR /app 0.0s
=> [builder 5/6] RUN go mod init hello 0.6s
=> [builder 6/6] RUN go build -o hello . 2.6s
=> [stage-1 4/4] COPY --from=builder /app/hello . 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:82672418757c3af71abf40c913be06f9ebc7acb403aff4b5548df2944187e22a 0.0s
=> => naming to docker.io/chq/hello-arch 0.0s
c查看镜像信息:
运行测试:
chq@chq:~/buildx-test$ docker run --rm chq/hello-arch:latest
WARNING: The requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64) and no specific platform was requested
Hello, arm64!
参考:
https://blog.csdn.net/dxylovejm123/article/details/127506574