首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有显示为arm64的码头划痕图像

问没有显示为arm64的码头划痕图像
EN

Stack Overflow用户
提问于 2021-02-25 22:47:40
回答 2查看 1.4K关注 0票数 3

我正在为多个体系结构(amd64和arm64 -都在Linux上)构建一个Docker映像。我使用的是多级构建--这意味着使用Go -高寒映像作为构建器(将Go源代码编译成可执行文件),然后将可执行文件复制到较小的次要映像中。

最初,我将编译后的程序复制到一个阿尔卑斯映像中,但我决定切换到一个scratch映像(因为安全方面的好处)--这涉及更改构建命令,以便静态地链接生成的可执行文件。我的Dockerfile现在是:

代码语言:javascript
复制
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),但是我不知道如何解决这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-05 00:47:42

您共享的代码片段正在交叉编译Go二进制文件,但正如您所指出的,它们仍然使用amd64基映像。要做到这一点,您需要为多个平台构建一个码头容器:

https://www.docker.com/blog/multi-arch-build-and-images-the-simple-way/

这个例子类似于:

代码语言:javascript
复制
docker buildx build \
--platform linux/arm64/v8,linux/amd64 \ 
--tag your-username/multiarch-example:buildx-latest .

使用码头平台路线,您不应该需要使用多层建筑,因为go工具应该推断平台的构建目的。

作为另一种选择,您可以在主机上交叉编译二进制文件,然后为每个平台提供一个基于该体系结构的划痕映像的对接映像,并将可执行文件复制到其中。

票数 2
EN

Stack Overflow用户

发布于 2021-04-18 03:26:27

因为你站在AMD机器和码头将默认拉AMD戈朗形象,以建立您的项目。有几种方法可以解决这个问题,但是我建议您使用--platform=$BUILDPLATFORM

https://docs.docker.com/buildx/working-with-buildx/

因此,您的Dockerfile看起来如下:

代码语言:javascript
复制
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命令:

代码语言:javascript
复制
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手臂图像

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66377636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档