Докер не может запустить выходной файл go, который уже существует - PullRequest
0 голосов
/ 16 марта 2019

Я создаю многоэтапный Dockerfile для моего проекта go.

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 Ответ

1 голос
/ 17 марта 2019

«Последняя» версия образа golang основана на debian, в которой используется libc. Alpine использует мусл. Если вы не скомпилируете с CGO_ENABLED=0, сетевые библиотеки будут ссылаться на libc, и отсутствие такого файла или каталога указывает на отсутствующую библиотеку. Вы можете проверить эти ссылки на общие библиотеки с помощью ldd /app/main. Несколько решений, которые я могу придумать:

  • скомпилируйте вашу программу с CGO_ENABLED=0
  • переключите ваш образ сборки на FROM golang:alpine
  • измените свою вторую ступень на FROM debian
...