У меня проблема с запуском моей локальной сборки, а также с настройкой моего Dockerfile.
Структура моего проекта выглядит так:
project
- cmd
main.go
- internal
- app
app.go
Dockerfile
Итак, в main.go
я говорю
import (
"project/internal/app"
)
Затем, когда я говорю go build
, я могу отлично работать локально.
Однако в моем Dockerfile я говорю
FROM golang
ENV GOPATH /go/src/github.com/project
COPY . /go/src/github.com/project
WORKDIR /go/src/github.com/project
RUN make linux
И я получаю вопрос:
cmd/main.go:4:2: cannot find package "Slaxtract/internal/app" in any of:
/usr/local/go/src/project/internal/app (from $GOROOT)
/go/src/github.com/project/src/project/internal/app (from $GOPATH)
Почему Docker добавляет src
к GOPATH? И как я могу настроить его, чтобы он выглядел в нужном месте?
Если я изменю свой main.go
на относительный путь, я могу взломать исправление, но тогда я не смогу работать локально, как я получаю
main.go:4:2: local import "../internal/app" in non-local package
Любая помощь будет очень признательна.
По умолчанию Go ожидает найти такие папки, как src
, pkg
и bin
внутри GOPATH
. Однако на самом деле вы указываете его на папку вашего проекта.
Чтобы исправить это, вам просто нужно указать GOPATH
на /go
.
Итак, ваш Dockerfile
должен выглядеть так
FROM golang
ENV GOPATH /go
COPY . /go/src/github.com/project
WORKDIR /go/src/github.com/project
RUN make linux
Дополнительную информацию можно найти на GOPATH
здесь.
Если вы устали от GOPATH
, вы можете попробовать гомомодули
Имя пакета @DavidMaze при импорте, которое вы имеете в виду
Также обратите внимание, что при такой структуре каталогов имя вашего пакета Go должно начинаться с
"github.com/project/..."
.