为什么基于 ARM 的 Go 应用的 Dockerfile 会从运行时路径中删除"linux_arm"?



我正在使用Dockerfile,如下所示,在基于ARM的Raspberry Pi上使用docker build创建图像。但是它在CCD_ 2步骤失败,因为它找不到路径"0"/go/bin/linux_arm/example experience";,以及几个调试";ls〃;在";构建器";阶段显示在该阶段创建的实际路径是"0"/go/bin/example实验(即缺少"linux_arm"目录级别(:

FROM golang:latest AS builder
ENV GOPATH $GOPATH:/go/src/example-experiment
ENV GOOS linux
ENV GOARCH arm
ENV GOARM 7
RUN apt-get update && apt-get install git
ADD . /go/src/example-experiment/
WORKDIR /go/src/example-experiment
RUN go get -v ./...
RUN go install
                                                                                                      
FROM scratch
# Copy the static executable.
COPY --from=builder /go/bin/linux_arm/example-experiment /go/bin/linux_arm/example-experiment
# Run the application's executable binary.
ENTRYPOINT ["/go/bin/linux_arm/example-experiment"]

我试着用RUN go build替换RUN go install,但同样的事情发生了。

这可能更多的是关于Go而不是Docker。但是,一位使用相同Dockerfile运行构建的同事发现它完成时没有任何错误,而且他们的基本映像可能使用了相同版本的Go。

实际错误如下:

Step 19/20 : COPY --from=builder /go/bin/linux_arm/example-experiment /go/bin/linux_arm/example-experiment
COPY failed: stat /var/lib/docker/overlay2/36eef7ea57e69d51c9f00dc151fde8c0e7cd38a2ca3e51505c153594f57db5ba/merged/go/bin/linux_arm/example-experiment: no such file or directory

我认为Go应该创建一个运行时路径/Go/bin/$GOOS_$GOARCH/。。。在本例中为/go/bin/linux_arm/。。。

我对此做了更多的挖掘。。

显然,go install的工作方式是本地二进制文件转到$GOPATH/bin,交叉编译的二进制文件转到$COPATH/bin/${GOOS}_${GOARCH]

因此,如果映像是在Windows上构建的(就像我的同事所做的那样(,那么ARM构建就被视为交叉编译,bin目录被设置为/go/bin/linux_ARM,这就是后来的COPY --from=builder命令所期望的,所以一切都正常。

但是,当(和我一样(在Raspberry Pi上完成相同的构建时,二进制路径被假定为/go/bin,COPY命令无法找到它所期望的目录。

我已经确认有效的解决方案是通过将GOBIN环境变量设置为:来定义二进制路径,使其在任何情况下都相同

ENV GOBIN/go/bin/${GOOS}_${GOOARCH}

所以这一次我回答了我自己的问题。

(我还为这个问题添加了一个"go"标签,因为这并不是真正的Docker问题。但我留下了"Docker"one_answers"dockerfile"标签,以防其他构建基于go的Docker图像的人遇到同样的问题。(

最新更新