docker can';t运行已存在的go输出文件

docker can';t运行已存在的go输出文件,docker,go,docker-multi-stage-build,Docker,Go,Docker Multi Stage Build,我正在为我的go项目构建一个多阶段Dockerfile FROM golang:latest as builder COPY ./go.mod /app/go.mod COPY ./go.sum /app/go.sum #exporting go1.11 module support variable ENV GO111MODULE=on WORKDIR /app/ #create vendor directory RUN go mod download COPY . /app/ R

我正在为我的go项目构建一个多阶段Dockerfile

FROM golang:latest as builder

COPY ./go.mod /app/go.mod
COPY ./go.sum /app/go.sum

#exporting go1.11 module support variable
ENV GO111MODULE=on

WORKDIR /app/

#create vendor directory
RUN go mod download

COPY . /app/

RUN go mod vendor

#building source code
RUN go build -mod=vendor -o main -v ./src/


FROM alpine:latest
RUN apk --no-cache add ca-certificates
COPY --from=builder /app/main /app/main
WORKDIR /app/

ARG port="80"
ENV PORT=$port
EXPOSE $PORT

CMD ["./main"]
运行映像时,它会抛出错误:

standard_init_linux.go:207: exec user process caused "no such file or directory"
我已验证/app/main中是否存在“main”文件。 我还试图通过添加

chmod +x /app/main
但它仍然不起作用。 有什么可能出错?

golang映像的“最新”版本基于debian,使用libc。阿尔卑斯山使用musl。如果不使用
CGO_ENABLED=0
进行编译,则网络库将链接到libc,并且“无此类文件或目录”错误将指向缺少的库。您可以使用
ldd/app/main
检查这些共享库链接。我能想到几个解决方案:

  • 使用
    CGO\u ENABLED=0编译程序
  • 将构建图像从golang:alpine切换到
  • 将第二阶段从debian更改为

你的主机操作系统是什么?使用-D选项运行Docker,看看它是否会给出任何有用的错误消息。请在
CMD[“/main”]
之前运行ls
并显示输出?@MostafaHussein这是MacOS。另外,我尝试了
ls
,它确实打印了一个很长的机器代码输出。