Search code examples
dockergogolang-migrate

Include Go dependencies in Docker container using mono repo


I have a mono repo with the structure.

mono-repo
- serviceA
 - main.go
 - Dockerfile
-serviceB
 - main.go
 - Dockerfile
go.mod
go.sum

The Dockerfile in serviceA contains the following code.

FROM golang

ENV GO111MODULE=on

WORKDIR /app

COPY . .

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

ENTRYPOINT ["/app/serviceA"]

I want to build the Docker image and include the dependencies from the root of my mono-repo inside the container, I am currently receiving an error saying it can't find any of the dependency packages when I run

docker build -t serviceA .

Unless I place a go.mod inside serviceA I can't see a nice way of achieving what I want. By placing a go.mod inside the service it feels like I'm losing the advantage of services sharing dependencies within the repo.


Solution

  • By placing a go.mod inside the service it feels like I'm losing the advantage of services sharing dependencies within the repo.

    Yet, this is an approach seen here or there, where COPY go.mod . (and COPY go.sum .) is followed by RUN go mod download.

    #This is the ‘magic’ step that will download all the dependencies that are specified in 
    # the go.mod and go.sum file.
    # Because of how the layer caching system works in Docker, the  go mod download 
    # command will _ only_ be re-run when the go.mod or go.sum file change 
    # (or when we add another docker instruction this line)
    RUN go mod download