我有一個構建并放入scratch影像的 Golang 專案:
# Build binary
FROM golang:1.17-alpine AS build-env
ADD . /app
WORKDIR /app
RUN env CGO_ENABLED=0 go build -ldflags="-s -w" -o myapp ./cmd/myapp/main.go
# Create image
FROM scratch
COPY --from=build-env /app/myapp /
ENTRYPOINT ["/myapp"]
由于 Golang 允許為多種架構進行交叉編譯(而且它比在模擬環境中構建要快得多),我想做這樣的事情:
# Build binary
FROM golang:1.17-alpine AS build-env
ADD . /app
WORKDIR /app
RUN env CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags="-s -w" -o myapp_linux_i386 ./cmd/myapp/main.go # Linux 32bit
RUN env CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o myapp_linux_x86_64 ./cmd/myapp/main.go # Linux 64bit
RUN env CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=5 go build -ldflags="-s -w" -o myapp_linux_arm ./cmd/myapp/main.go # Linux armv5/armel/arm (it also works on armv6)
RUN env CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -ldflags="-s -w" -o myapp_linux_armhf ./cmd/myapp/main.go # Linux armv7/armhf
RUN env CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="-s -w" -o myapp_linux_aarch64 ./cmd/myapp/main.go # Linux armv8/aarch64
RUN env CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags="-s -w" -o myapp_freebsd_x86_64 ./cmd/myapp/main.go # FreeBSD 64bit
RUN env CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w" -o myapp_darwin_x86_64 ./cmd/myapp/main.go # Darwin 64bit
RUN env CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w" -o myapp_darwin_aarch64 ./cmd/myapp/main.go # Darwin armv8/aarch64
RUN env CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags="-s -w" -o myapp_windows_i386.exe ./cmd/myapp/main.go # Windows 32bit
RUN env CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags="-s -w" -o myapp_windows_x86_64.exe ./cmd/myapp/main.go # Windows 64bit
但是我該如何創建和推送多架構 docker 鏡像呢?
# Create image
...
uj5u.com熱心網友回復:
從這個問題來看,這聽起來不像你想避免 buildx,而更像是你想避免在解釋器下運行編譯器,而是使用 Go 的內置交叉編譯功能。這是 buildx 內置的:
# Build binary
FROM --platform=$BUILDPLATFORM golang:1.17-alpine AS build-env
ADD . /app
WORKDIR /app
ARG TARGETOS
ARG TARGETARCH
RUN CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} \
go build -ldflags="-s -w" -o myapp ./cmd/myapp/main.go
# Create image
FROM scratch
COPY --from=build-env /app/myapp /
ENTRYPOINT ["/myapp"]
--platform在您正在構建的平臺上運行第一階段。并且 TARGETOS 和 TARGETARCH 是 buildkit 的內置引數。然后,您可以使用以下命令進行構建:
docker buildx build \
--platform="linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x" \
-t registry/image:tag \
.
請注意,Docker 不支持 MacOS,它在該平臺上的 Linux VM 中運行。而且我也不相信 windows/386 是有效的,我只在 amd64 上看到過 docker,并且可能支持 arm64。
除此之外,還有多種方式可以推送多平臺清單。dockerdocker manifest內置了。或者您可以自己生成清單并將其推送到具有 API 呼叫的注冊表(如果您想了解低級別的詳細資訊,請參閱 OCI 的影像規范和分發規范)。但是如果你有 docker,buildx 是一個簡單的按鈕。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/438842.html
下一篇:io/ioutil的問題
