Не собирается docker

Пытаюсь собрать контейнер docker. Делаю все по инструкции, но получаю ошибку. Подскажите, пожалуйста, как это исправить?
Первый раз работаю с Docker и пока что не знаю где искать траблу. Прикладываю скрины ошибок и процесса сборки.
Проблема возникает конкретно в строке RUN docker-файла. Ругается на то, что в GOPATH есть .mod файл, а его не должно быть. Прикладываю также содержимое GOPATH. Там нет .mod файла, разве что он рекурсивно находит его в папке проекта в src. Но без mod файла не получится разрабатывать приложение, так как разработка идёт через модули.
Спасибо Процесс сборки+GOPATH


Ответы (1 шт):

Автор решения: Pak Uula

Правильно компилятор ругается. Вы собираете ваше приложение в образе golang. В этом образе GOPATH=/go, и текущий каталог тоже /go. Инструкция COPY ./ ./ копирует ваше приложение в /go образа, а инструкция RUN go build . запускает сборку тоже в /go, то есть внутри $GOPATH

Вам нужно собирать в другом каталоге. Например, добавьте в начало инструкцию WORKDIR, чтобы все последующие инструкции запускались в другом каталоге:

FROM golang:1.21.4

WORKDIR /app

COPY ./ ./

RUN go build -o ./test .
CMD ["./test"]

Работает, проверено.

Но я предлагаю вам пойти дальше и уменьшить образ, удалив из итогового образа исходные файлы и промежуточные файлы сборки. Для этого используйте фичу multi-stage build.

FROM golang:1.21.4 as builder

WORKDIR /app

COPY ./ ./

RUN go build -o ./test .

FROM alpine:latest as runner
# добавить glibc для приложения
RUN apk add gcompat
WORKDIR /app
# Скопировать собранный бинарник, "забыв" все остальные файлы из builder
COPY --from=builder /app/test ./
CMD ["./test"]

Этап builder использует большой образ golang для сборки приложения. Затем этот образ выбрасывается и заменяется суперкомпактным alpine. Единственное, в alpine нужно добавить glibc, с которой слинкован образ, собранный в builder, без этого не запустится.

Из builder нужно взять бинарник, собранный командой go build. Если ваше приложение использует какие-либо ресурсы, их тоже нужно перенести в рабочий образ.

→ Ссылка