【发布时间】:2021-05-28 08:25:51
【问题描述】:
我正在为多种架构(amd64 和 arm64 - 都在 Linux 上)构建 Docker 映像。我正在使用多阶段构建 - 这意味着使用 go-alpine 映像作为构建器(将我的 Go 源代码编译为可执行文件),然后将可执行文件复制到较小的辅助映像。
最初,我将编译后的程序复制到 Alpine 映像中,但我决定切换到临时映像(出于安全考虑) - 这涉及更改我的构建命令,以便生成的可执行文件是静态链接的。我的 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),但我不知道如何解决这个问题。
【问题讨论】: