Папки модов Go не найдены в Docker

Я очень новичок в использовании модулей, и я пытаюсь взять проект и обновить его, чтобы использовать их, поскольку они кажутся действительно отличным способом наконец-то справиться с моими зависимостями. Однако у меня возникла проблема с сборкой в ​​Docker.

У меня есть проект с файлом main.go и go.mod (который ссылается как на частные / локальные репозитории, так и на общедоступные, такие как go.uber.org/zap). Я назвал свой модуль github.internal.com/team_name/project_name Я продал свои зависимости. Итак, моя структура проекта выглядит так:

project
- main.go
- internal
  - utils.go
- go.mod (github.internal.com/team_name/project_name)
- vendor
  - go.uber.org
  - private.repo.com
Dockerfile

Затем в main.go я импортирую

import (
    "github.internal.com/team_name/project_name/internal"
    "go.uber.org/zap"
)

Все это прекрасно работает, и я могу запустить go build без проблем.

Проблема возникает, когда я пытаюсь построить с помощью Docker. В моем Dockerfile я запускаю

ENV GOPATH /go
COPY . /go/src/github.internal.com/team_name/project_name
WORKDIR /go/src/github.internal.com/team_name/project_name
RUN CGO_ENABLED=0 GOOS=linux go build -a -o slaxtract main.go

Когда я запускаю docker build, он возвращает:

main.go:7:2: cannot find package "github.internal.com/team_name/project_name/internal" in any of:
    /go/src/github.internal.com/project_name/team_name/vendor/github.internal.com/project_name/team_name/internal (vendor tree) 
    /usr/local/go/src/github.internal.com/team_name/project_name/internal (from $GOROOT)
    /go/src/github.internal.com/team_name/project_name/internal (from $GOPATH)

Как мне попасть в нужный каталог, чтобы распознать все мои файлы в моем модуле?

Заранее спасибо!


person LivingRobot    schedule 19.07.2019    source источник
comment
Если все ваши зависимости поставлены (каталог поставщика, созданный go mod vendor), вам нужно добавить флаг -mod=vendor в go build, чтобы он их использовал.   -  person Mark A    schedule 19.07.2019


Ответы (1)


Убедитесь, что в go включены модули go. Это можно сделать, установив для env var GO111MODULE значение on.

Кроме того, поскольку вы поставили зависимости своих модулей, вы должны построить, используя флаг mod=vendor как: go build -mod=vendor

Что-то вроде CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -mod=vendor -a -o slaxtract main.go должно работать.

person Gustavo Paiva    schedule 19.07.2019