Docker не может найти зависимости в файле go.mod - PullRequest
0 голосов
/ 21 февраля 2019

Я работаю в проекте с GoLang и Docker и использую go.mod для поддержки зависимостей.Проект работает нормально, когда я собираю без Docker, но когда я пытаюсь создать образ Docker, появляется эта ошибка:

internal/server/server.go:8:2: cannot find package "github.com/gorilla/mux" in any of:
        /usr/local/go/src/github.com/gorilla/mux (from $GOROOT)
        /go/src/github.com/gorilla/mux (from $GOPATH)
cmd/root.go:7:2: cannot find package "github.com/spf13/cobra" in any of:
        /usr/local/go/src/github.com/spf13/cobra (from $GOROOT)
        /go/src/github.com/spf13/cobra (from $GOPATH)
make: *** [Makefile:30: build] Error 1

Dockerfile

# Build Stage
FROM lacion/alpine-golang-buildimage:1.9.7 AS build-stage

LABEL app="build-status-hub"
LABEL REPO="https://github.com/MSLacerda/status-hub"

ENV PROJPATH=/go/src/github.com/MSLacerda/status-hub

# Because of https://github.com/docker/docker/issues/14914
ENV PATH=$PATH:$GOROOT/bin:$GOPATH/bin

ADD . /go/src/github.com/MSLacerda/status-hub
WORKDIR /go/src/github.com/MSLacerda/status-hub

RUN make build

Dockerfile фактически имеетбольше инструкций, но я поместил здесь только часть, когда консоль показывает ошибку.

Makefile

build:
    @echo "building ${BIN_NAME} ${VERSION}"
    @echo "GOPATH=${GOPATH}"
    go build -ldflags "-X github.com/MSLacerda/status-hub/version.GitCommit=${GIT_COMMIT}${GIT_DIRTY} -X github.com/MSLacerda/status-hub/version.BuildDate=${BUILD_DATE}" -o bin/${BIN_NAME}

go.mod

module github.com/MSLacerda/status-hub

require (
    github.com/Sirupsen/logrus v1.0.6
    github.com/gorilla/mux v1.7.0
    github.com/spf13/cobra v0.0.3
    github.com/spf13/viper v1.2.0
    golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2 // indirect
)

1 Ответ

0 голосов
/ 21 февраля 2019

Что такое взлом?

Когда вы пытаетесь создать приложение, требуемые депы не устанавливаются в образ докера

Почему это происходит вобраз docker, а не в моем локальном dev env?

В вашем локальном dev env вы устанавливаете / получаете требуемые команды запуска deps, как в следующем примере.

$ go get -u github.com/go-swagger/go-swagger/cmd/swagger

Но каждый контейнер / изображение будет пустым / чистым env.Вы должны указать для док-контейнера, который требуется для первой установки deps.

Решение

  • Используйте Makefiles для создания задачи / команд для вашего проекта.Подробнее об этом здесь

  • Создание команды make file для установки deps и построения проекта

Пример Makefile

.PHONY: setup
setup: @echo Installing dependencies:
    go get -u github.com/go-swagger/go-swagger/cmd/swagger

.PHONY: build
build: setup
    go build -o $(BINARY) $(APP_FILE)
  • Затем нужно вызвать команду make build для создания вашего образа вместо используемой в настоящее время сборки go.

  • Вместо использования команд go get для каждой зависимости используйте менеджер go dep, чтобы сделать это.Следуя примеру.

Makefile

.PHONY: setup
setup: @echo Installing dependencies:
    dep ensure

Подробнее об этом здесь

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