Golang Docker多阶段构建无法运行:exec:“ go”:在$ PATH中找不到可执行文件

时间:2019-01-29 23:31:57

标签: docker go

使用Docker多阶段构建部署简单的API时,会引发以下错误:

$ docker build -t api:latest .
[...]
$ docker run -p 4880:4880 --rm --name=api api:latest
2019/01/29 23:02:15 exec: "go": executable file not found in $PATH

由于我的应用程序未从任何地方(或任何go)调用exec.Command,因此我运行了go mod vendor,因此可以检查依赖项源代码并找到以下内容:

vendor/github.com/lib/pq/oid/gen.go
12:     "os/exec"
64:     cmd := exec.Command("gofmt")

这可能是问题,如果是的话,我该如何解决?我确定,我之前已经设法在多阶段构建中部署了github.com/lib/pq,但是我目前仍然受困。

非常感谢,并祝您黑客愉快。

Dockerfile

FROM golang:1-alpine AS builder
ENV GO111MODULE=on
RUN apk --no-cache add ca-certificates git
WORKDIR /app
# Copy go module info first...
COPY go.mod .
COPY go.sum .
# ...then download to cache dependencies between builds
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -installsuffix cgo -ldflags '-extldflags "-static"' -o api cmd/api/

FROM scratch
WORKDIR /app
COPY --from=builder /app/api /app/
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
EXPOSE 8080
ENTRYPOINT ["./api"]

1 个答案:

答案 0 :(得分:1)

您的实际生产线:

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -installsuffix cgo -ldflags '-extldflags "-static"' -o api cmd/api/

缺少cmd前面的相对路径,取而代之的是./cmd/api将导致成功的构建/运行。 cmd/api显然是一个真实的东西,https://golang.org/cmd/api/,所以它不是犯错误了,但还没有做你期望它做的事。如果键入go run cmd/api在终端你应该看到一吨输出无关的到应用程序。