大多數(shù)帶有Docker官方標識的鏡像都提供了多架構支持。如:busybox鏡像支持amd64
,?arm32v5
,?arm32v6
,?arm32v7
,?arm64v8
,?i386
,?ppc64le
, and?s390x。
當你在amd64設備上運行容器時,會拉取amd64鏡像。
當你需要構建多平臺鏡像時,可以用 --platform 參數(shù)指定目標平臺,但是通常情況下,你只能一次構建一個單一架構平臺的鏡像。如果想要一次構建多平臺鏡像,你需要使用docker container build driver,可以使用buildx插件進行配置,替換打包命令。
QEMU
跨平臺打包可以使用QEMU,但是它比本機構建慢得多,依賴QEMU將本機指令轉(zhuǎn)義為目標架構指令,從而實現(xiàn)跨平臺編譯。一般Linux kernel 4.8以后版本,支持binfmt-support 2.1.7及以上版本的平臺,都能支持跨平臺編譯。你可以用以下步驟快速開啟:
docker run --privileged --rm tonistiigi/binfmt --install all
為不同架構平臺創(chuàng)建本地節(jié)點,--apend可以追加到同一個構建器中:
docker buildx create --use --name mybuild node-amd64
mybuild
docker buildx create --append --name mybuild node-arm64
同時構建多平臺鏡像:
docker buildx build --platform linux/amd64,linux/arm64 .
這里用buildx插件代替默認build,一次打包多平臺鏡像,不做過多介紹。
交叉編譯
docker可以輕松打包多平臺的鏡像,但是目標程序的交叉編譯取決于開發(fā)編譯環(huán)境。Golang就很容易實現(xiàn)交叉編譯,結合docker多階段構建技術,可以實現(xiàn)一次編譯打包多平臺鏡像。
首先安裝buildx插件,
下載?
?重命名并放到docker插件目錄里:
mv buildx-v0.11.2.linux-amd64 docker-buildx
mkdir .docker/cli-plugins -p
mv docker-buildx .docker/cli-plugins/
chmod +x .docker/cli-plugins/docker-buildx
docker-compose也可以作為插件放到插件目錄里,
mv docker-compose .docker/cli-plugins/
使用時可用如下的命令,無需使用docker-compose,這是題外話。
docker compose up -d
?其次創(chuàng)建構建器,
$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
mybuilder * docker-container
mybuilder0 unix:///var/run/docker.sock running v0.12.3 linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
default docker
default default running v0.8.2+eeb7b65 linux/amd64, linux/386, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/arm/v7, linux/arm/v6
ls命令列出已有的構建器,default是docker默認的構建器,mybuilder是我創(chuàng)建的構建器,可以用如下命令進行創(chuàng)建,
docker buildx create --name mybuilder --bootstrap --use
這條命令會創(chuàng)建mybuilder構建器,并啟動,設置為默認構建器。
到這里環(huán)境就算配置好了,但是要想編譯打包多平臺鏡像,還需要編輯Dockerfile,
FROM --platform=$BUILDPLATFORM golang:latest AS builder
ARG TARGETARCH
RUN apt-get update && apt-get install -y gcc-aarch64-linux-gnu
WORKDIR /app
COPY . .
RUN go env -w GOOS=linux GOARCH=$TARGETARCH CGO_ENABLED=1 GOPROXY=https://goproxy.cn,direct
RUN if [ "$TARGETARCH" = "arm64" ]; then go env -w AR=aarch64-linux-gnu-ar CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++; fi
RUN go mod tidy
RUN go build -a -ldflags '-extldflags "-static"' -o server main.go
FROM alpine:latest
RUN set -eux && sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
RUN apk update && apk add sqlite
WORKDIR /server
RUN mkdir -p /server/data
COPY --from=builder /app/server /app/config.docker.yaml ./
COPY --from=builder /app/resource/cert ./resource/cert
EXPOSE 8660
ENTRYPOINT ./server -c config.docker.yaml
上面的Dockerfile采用多階段構建方式支持交叉編譯,多平臺打包。
第一階段進行交叉編譯
第二階段進行目標平臺鏡像打包
里面用到docker-container驅(qū)動的環(huán)境變量有:
BUILDPLATFORM? 編譯平臺,即當前宿主機的平臺架構
TARGETPLATFORM
BUILDARCH
TARGETARCH 目標平臺架構,即多平臺編譯打包時的目標架構GOARCH=$TARGETARCH 指定了Go編譯目標架構?
golang:latest、alpine:latest鏡像都是支持多架構的鏡像,golang:latest是基于debian構建,為了交叉編譯,需要安裝交叉編譯環(huán)境,
apt-get install -y gcc-aarch64-linux-gnu
?因為Go程序中用到了cgo特性,需要打開它
CGO_ENABLED=1
同時,如果目標平臺是arm64的話,需配置go gcc等編譯器環(huán)境變量
RUN if [ "$TARGETARCH" = "arm64" ]; then go env -w AR=aarch64-linux-gnu-ar CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++; fi
當然,第一步也可以直接在目標平臺編譯,不過速度有點洗人:
FROM --platform=$TARGETPLATFORM golang:1.21 AS builder
ARG TARGETARCH
RUN set -eux && sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list.d/debian.sources
RUN apt-get update && apt-get install -y libssl-dev g++
WORKDIR /app
COPY . .
RUN go env -w GOOS=linux GOARCH=$TARGETARCH CGO_ENABLED=1 GOPROXY=https://goproxy.cn,direct
RUN go mod tidy
RUN go build -a -ldflags '-extldflags "-static"' -o server main.go
最后,執(zhí)行buildx命令
docker buildx build --platform linux/arm64,linux/amd64 -t 172.16.60.12:8888/star/iot-go . --push
編譯打包多平臺鏡像并推送到倉庫中。也可以輸出單一平臺,并保存到本地,
docker buildx build --platform linux/arm64 -t star/iot-go . --load
參考資料:
Multi-platform images?| Docker Docs文章來源:http://www.zghlxwxcb.cn/news/detail-740913.html
How to use docker buildx to build multi-architecture Go images文章來源地址http://www.zghlxwxcb.cn/news/detail-740913.html
到了這里,關于Docker多平臺、跨平臺編譯打包的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!