Golang Dockerfile: не удается найти пакеты в сборке Docker, но работает нормально - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть следующая настройка dockerfile для многоступенчатой ​​сборки для моего проекта микросервиса golang

FROM golang:alpine as builder

RUN apk --no-cache add git

WORKDIR /app/vessel-service

COPY . .

RUN go mod download
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o vessel-service

# Second Stage
...

У меня есть следующий импорт в main.go

import (
  "context"
  "errors"
  "fmt"

  pb "github.com/thededlier/go-micro-shippy/vessel-service/proto/vessel"
  micro "github.com/micro/go-micro"
)

, где судно обслуживает один для текущего проекта.

При запуске docker build -t vessel-service . Я получаю следующую ошибку

Step 5/12 : RUN go mod download
 ---> Running in 1d0121039462
warning: pattern "all" matched no module dependencies
Removing intermediate container 1d0121039462
 ---> b66add421d26
Step 6/12 : RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o vessel-service
 ---> Running in ef50eff44a3b
main.go:9:3: cannot find package "github.com/micro/go-micro" in any of:
  /usr/local/go/src/github.com/micro/go-micro (from $GOROOT)
  /go/src/github.com/micro/go-micro (from $GOPATH)
main.go:8:3: cannot find package "github.com/thededlier/go-micro-shippy/vessel-service/proto/vessel" in any of:
  /usr/local/go/src/github.com/thededlier/go-micro-shippy/vessel-service/proto/vessel (from $GOROOT)
  /go/src/github.com/thededlier/go-micro-shippy/vessel-service/proto/vessel (from $GOPATH)

Но у меня есть ~/go/src/github.com/micro/go-micro. При попытке просто запустить main.go, он работает без проблем.

Это проблема с настройкой среды или есть что-то еще?

Вот краткое изложение моего go.mod

    module github.com/thededlier/go-micro-shippy

    go 1.12

    require (
      ...
      github.com/micro/go-micro v1.1.0
      ...
    )
    replace github.com/testcontainers/testcontainer-go => github.com/testcontainers/testcontainers-go v0.0.0-20190108154635-47c0da630f72

    replace sourcegraph.com/sourcegraph/go-diff => github.com/sourcegraph/go-diff v0.5.1

    replace github.com/golang/lint => golang.org/x/lint v0.0.0-20190409202823-959b441ac422

    replace github.com/Sirupsen/logrus => github.com/sirupsen/logrus v1.4.1

1 Ответ

3 голосов
/ 25 апреля 2019

Вам необходимо скопировать файл go.mod и go.sum в контейнер, а также установить для переменной ENV GO111MODULE значение on, например: ENV GO111MODULE=on.

Полный пример Dockerfile:

FROM golang:1.12

ENV GO111MODULE=on
ENV PORT=8090
WORKDIR /app

COPY go.mod .
COPY go.sum .

RUN go mod download

COPY . .

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

EXPOSE 8090
ENTRYPOINT ["/app/your-app-name"] 

Если он по-прежнему не работает, попробуйте изменить версию Golang на конкретную последнюю версию, как в примере выше.У меня раньше была проблема с версией Golang.Но вы получаете ошибку из-за файла go.mod, который не существует в контейнере.

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