我正在为多个体系结构(amd64和arm64 -都在Linux上)构建一个Docker映像。我使用的是多级构建--这意味着使用Go -高寒映像作为构建器(将Go源代码编译成可执行文件),然后将可执行文件复制到较小的次要映像中。
最初,我将编译后的程序复制到一个阿尔卑斯映像中,但我决定切换到一个scratch映像(因为安全方面的好处)--这涉及更改构建命令,以便静态地链接生成的可执行文件。我的Dockerfile现在是:
FROM golang:1.16 AS builder
WORKDIR /go/src/
RUN go get -d -v ./...
COPY . .
RUN env ${opts} go build -a -installsuffix cgo -o app .
FROM scratch
WORKDIR /root/
COPY --from=builder /go/src/app .
CMD ["./app"]当我为amd64构建时,我运行docker build --build-arg opts="CGO_ENABLED=0 GOOS=linux GOARCH=amd64" -t myuser/example:amd64 . --如果我检查这个映像,它将显示"Architecture": "amd64"。
当我为arm64构建时,我运行docker build --build-arg opts="CGO_ENABLED=0 GOOS=linux GOARCH=arm64" -t myuser/example:arm64 . --如果我检查这个映像,它会显示"Architecture": "amd64" --这不是我想要的。
如果我通过运行CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build在本地编译Go代码,然后在编译器输出上运行file,则显示编译后的输出是arm64。因此,我假设这个问题是Docker拔出一个amd64基本映像的结果(因为我的PC是x86),但是我不知道如何解决这个问题。
发布于 2021-03-05 00:47:42
您共享的代码片段正在交叉编译Go二进制文件,但正如您所指出的,它们仍然使用amd64基映像。要做到这一点,您需要为多个平台构建一个码头容器:
https://www.docker.com/blog/multi-arch-build-and-images-the-simple-way/
这个例子类似于:
docker buildx build \
--platform linux/arm64/v8,linux/amd64 \
--tag your-username/multiarch-example:buildx-latest .使用码头平台路线,您不应该需要使用多层建筑,因为go工具应该推断平台的构建目的。
作为另一种选择,您可以在主机上交叉编译二进制文件,然后为每个平台提供一个基于该体系结构的划痕映像的对接映像,并将可执行文件复制到其中。
发布于 2021-04-18 03:26:27
因为你站在AMD机器和码头将默认拉AMD戈朗形象,以建立您的项目。有几种方法可以解决这个问题,但是我建议您使用--platform=$BUILDPLATFORM
https://docs.docker.com/buildx/working-with-buildx/
因此,您的Dockerfile看起来如下:
FROM --platform=$BUILDPLATFORM golang:1.16 AS builder
ARG BUILDPLATFORM
WORKDIR /go/src/
RUN go get -d -v ./...
COPY . .
RUN env ${opts} go build -a -installsuffix cgo -o app .
FROM --platform=$BUILDPLATFORM scratch
WORKDIR /root/
COPY --from=builder /go/src/app .
CMD ["./app"]以及本地的build命令:
docker build --build-arg BUILDPLATFORM=linux/arm64 --build-arg opts="CGO_ENABLED=0 GOOS=linux GOARCH=arm64" -t myuser/example:arm64 .但是如果您正在使用Github或CircleCI构建您的Golang图像,请查看下面的博客文章
Github https://namiops.medium.com/golang-multi-arch-docker-image-with-github-action-b59a62c8d2bd中的Golang多拱图像
用CircleCI https://namiops.medium.com/golang-arm64-docker-image-with-circleci-arm-machine-8bebf2151b92实现Golang手臂图像
https://stackoverflow.com/questions/66377636
复制相似问题