I'm very new to go modules and am trying to take a project and update it to use them as they seem like a really great way to finally handle my dependencies. However, I'm having an issue getting things to build in Docker.
I have a project with a main.go
and a go.mod
file (which references both private/local repos as well as public ones like go.uber.org/zap
). I've named my module github.internal.com/team_name/project_name
I've vendored up my dependencies. So, my project structure looks like:
project
- main.go
- internal
- utils.go
- go.mod (github.internal.com/team_name/project_name)
- vendor
- go.uber.org
- private.repo.com
Dockerfile
Then, in main.go
I import
import (
"github.internal.com/team_name/project_name/internal"
"go.uber.org/zap"
)
All of this works great and I can run go build
no problem.
The issue comes when I try to build using Docker. In my Dockerfile I run
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
When I run docker build
it returns:
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)
How do I get to the right directory to recognize all of my files in my module?
Thanks in advance!
Make sure go has the go modules enabled, you can enforce this by setting the env var GO111MODULE
to on
.
Also as you have vendored your modules dependencies you should build using the mod=vendor
flag as: go build -mod=vendor
Something like CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -mod=vendor -a -o slaxtract main.go
should work.