Не удалось запустить многоэтапную сборку Docker Golang: exec: "go": исполняемый файл не найден в $ PATH - PullRequest
0 голосов
/ 30 января 2019

При развертывании простого API с многоэтапной сборкой Docker выдается следующая ошибка:

$ 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 голосов
/ 31 января 2019

В вашей фактической строке сборки:

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 в своем терминале, вы увидите тонну вывода, не связанного с вашим приложением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...