Я новичок в golang и docker, поэтому, просмотрев множество тем и интернет-ресурсов, я запутался в том, как мне все настроить.
Моя проблема в том, что я столкнулся с ошибкой сборки докеров приложения golang из-за не найденной локальной зависимости.
К вашему сведению (локальный компьютер): версия go1.13.4 linux / amd64
Вот контекст моей проблемы:
У меня есть репозиторий, в котором будут храниться исходные коды простых микросервисов (написанных на Go), которые будут работать в Kubernetes. Таким образом, каждая папка в репозитории представляет собой службу. У меня также есть папка «tools», в которой перегруппированы вспомогательные функции и ресурсы, общие для многих сервисов. Мой репозиторий не находится в каких-либо специальных путях Go, он находится в корне одного из моих дисков. Вот как выглядит мое репо:
.
├── service1
│ ├── main.go
│ ├── Dockerfile
│ ├── go.mod
│ └── go.sum
├── service2
├── service3
│ ...
├── serviceX
├── tools
│ ├── helpers.go
│ ├── ressources.go
│ ├── go.mod
└── └── go.sum
Таким образом, каждая папка / служба - это модуль go для независимой обработки своих зависимостей. Инструменты папки также являются модулем. Я инициализировал каждый модуль с помощью go mod init FOLDER_NAME
В сервисе service1 я ссылаюсь на модуль tools для использования некоторых функций. Вот как я это реализовал: (src of ./service1/main.go)
package main
import (
"fmt"
st "../tools"
// other modules imports
)
func main() {
st.ExecHelperFunc()
// http server inits
}
Когда я локально запускаю service1's main.go или локально создаю его и затем запускаю двоичный файл, служба работает нормально.
Но когда я пытаюсь создать файл докеров service1, я получаю ошибку сборки golang: build _/go/src/app/tools: cannot find module for path _/go/src/app/tools
Вот мой файл докеров:
FROM golang:1.13 as builder
ENV GO111MODULE=on
WORKDIR /go/src/app
COPY ./tools ./tools
COPY ./service1 ./service1
WORKDIR /go/src/app/tools
RUN go mod download
WORKDIR /go/src/app/service1
RUN go mod download
WORKDIR /go/src/app
RUN go build -o server /go/src/app/service1/main.go
FROM centos:7
RUN yum -y update && yum clean all
COPY --from=builder /go/src/app/server .
EXPOSE 3000
CMD ["./server"]
Итак, я не понимаю, почему докеру не удается создать службу? По-видимому, он не может найти / идентифицировать инструменты модуля, но почему? Я пробовал много разных настроек для файла докеров, но так и не понял.
Спасибо заранее за вашу помощь.
ОБНОВЛЕНИЕ:
Как было предложено в ответе, изменение значения GO111MODULE в файле докеров с on на auto не исправило ошибку сборки, но принесло мне новую:
unexpected directory layout:
import path: _/go/src/app/tools
root: /go/src
dir: /go/src/app/tools
expand root: /go
expand dir: /go/src/app/tools
separator: /