docker无法运行已经存在的go输出文件

时间:2019-03-16 19:04:54

标签: 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/

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

但仍然无法正常工作。 可能有什么问题吗?

1 个答案:

答案 0 :(得分:1)

golang映像的“最新”版本基于debian,它使用libc。高山使用麝香。如果不使用Start-Job -ScriptBlock {& $using:command} 进行编译,则网络库将链接到libc,并且no此类文件或目录错误均指向缺少的库。您可以使用CGO_ENABLED=0检查这些共享库链接。我能想到的一些解决方案:

  • 使用ldd /app/main
  • 编译程序
  • 将构建映像切换为CGO_ENABLED=0
  • 将第二阶段更改为FROM golang:alpine