我正在使用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图像的人遇到同样的问题。(