0

我正在为我的 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 中。我还尝试通过添加来授予可执行权限

chmod +x /app/main

但它仍然不起作用。什么可能是错的?

4

1 回答 1

1

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

  • 编译你的程序CGO_ENABLED=0
  • 将您的构建映像切换到FROM golang:alpine
  • 将您的第二阶段更改为FROM debian
于 2019-03-17T13:01:18.597 回答