Как использовать мод go с локальным пакетом и docker? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть два модуля go github.com/myuser/mymainrepo и github.com/myuser/commonrepo

Вот как у меня файлы на моем локальном компьютере

- allmyrepos  
 - mymainrepo
   - Dockerfile
   - go.mod
 - commonrepo
   - go.mod

mymainrepo / go .mod

...
require (
  github.com/myuser/commonrepo
)

replace (
  github.com/myuser/commonrepo => ../commonrepo
)

Работает хорошо, я могу делать с ним локальную разработку. Проблема возникает, когда я создаю docker образ mymainrepo

mymainrepo / Dockerfile

...
WORKDIR /go/src/mymainrepo

COPY go.mod go.sum ./
RUN go mod download


COPY ./ ./
RUN go build -o appbinary
...

Здесь replace заменяет github.com/myuser/commonrepo на ../commonrepo но в Docker /go/src/commonrepo не существует.

Я создаю образ Docker на CI / CD, который нужно получать напрямую с удаленного URL-адреса github, но мне также нужно выполнить локальную разработку на commonrepo. Как я могу сделать и то, и другое?

Я попытался поместить все свои файлы в GOPATH, поэтому это ~/go/src/github.com/myuser/commonrepo и go/src/github.com/myuser/mymainrepo. И я удалил директиву replace. Но он ищет commonrepo внутри ~/go/pkg/mod/..., загруженный с github.

1 Ответ

1 голос
/ 07 мая 2020

Создайте два файла go.mod: один для локальной разработки, а другой - для вашей сборки. Вы можете назвать его, например, go.build.mod.

Сохраните директиву replace в своем файле go.mod, но удалите ее из go.build.mod.

Наконец, в вашем Dockerfile:

COPY go.build.mod ./go.mod
COPY go.sum ./
...