jpskgc.v3
jpskgc.v3

Reputation: 839

What to code in Dockerfile and docker-compose to pass local package

I introduced local package with go modules for server side api. It works fine in local environment without error by commanding go run main.go.

But it does not work when commanding docker-compose up.

I want to know how to fix Dockerfile and docker-compose.yml.

I command go mod init at article directory.

As result, it sets module github.com/jpskgc/article in go.mod.

article
  ├ db
  ├ client
  ├ api
  │  ├ main.go
  │  ├ controller
  │  │    └ controller.go
  │  └ Dockerfile
  ├ nginx
  ├ docker-compose.yml
  ├ go.mod
  └ go.sum

main.go

package main

import (
    "database/sql"
    "os"
    "time"
    "github.com/gin-contrib/cors"
    "github.com/gin-gonic/gin"
    _ "github.com/go-sql-driver/mysql"
    "github.com/joho/godotenv"
    "github.com/jpskgc/article/api/controller"
)
    api := router.Group("/api")
    {
        api.GET("/articles", func(c *gin.Context) {
            controller.GetArticleController(c, db)
        })
    }
    router.Run(":2345")
}

Dockerfile

FROM golang:latest
ENV GO111MODULE=on
WORKDIR /app
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
ENTRYPOINT ["/app/api"]

docker-compose.yml

version: '3'
services:
  api:
    build:
      dockerfile: Dockerfile.dev
      context: ./api
    volumes:
      - ./api:/app
    depends_on:
      - db
    tty: true
    environment:
      - AWS_ACCESS_KEY_ID
      - AWS_SECRET_ACCESS_KEY
      - MYSQL_USER
      - MYSQL_PASSWORD
      - MYSQL_HOST
      - GO111MODULE

go.mod

module github.com/jpskgc/article

go 1.12

require (
    github.com/aws/aws-sdk-go v1.23.7
    github.com/gin-contrib/cors v1.3.0
    github.com/gin-gonic/gin v1.4.0
    github.com/go-sql-driver/mysql v1.4.1
    github.com/google/uuid v1.1.1
    github.com/joho/godotenv v1.3.0
)

I expect server side api working fine without error in docker environment. But the actual is that docker environment for server side fails to run.

Here is error message when commanding docker-compose up

api_1     | main.go:14:2: cannot find package "github.com/jpskgc/article/api/controller" in any of:
api_1     |     /usr/local/go/src/github.com/jpskgc/article/api/controller (from $GOROOT)
api_1     |     /go/src/github.com/jpskgc/article/api/controller (from $GOPATH)

Here is the entire source code on github (branch: try-golang-mod).

Upvotes: 0

Views: 1113

Answers (2)

D. Vinson
D. Vinson

Reputation: 1158

looks like PATH issue try this Dockerfile

FROM golang:latest
ENV GO111MODULE=on
WORKDIR /go/src/github.com/user/myProject/app
COPY . .
RUN go mod download
RUN go build
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
ENTRYPOINT ["/go/src/github.com/user/myProject/app/api"]

Set Volume in compose file to:

./api:/go/src/github.com/user/myProject/app

not tested, actual results may vary, but hopefully helps

Upvotes: 0

thepudds
thepudds

Reputation: 5284

This error message seems to indicate that Go modules are not enabled:

Here is error message when commanding docker-compose up

api_1     | main.go:14:2: cannot find package "github.com/jpskgc/article/api/controller" in any of:
api_1     |     /usr/local/go/src/github.com/jpskgc/article/api/controller (from $GOROOT)
api_1     |     /go/src/github.com/jpskgc/article/api/controller (from $GOPATH)

I would double check that the GO111MODULE=on environment variable is being set and propagated properly.

There are some other things you could check here:

https://github.com/golang/go/wiki/Modules#what-are-some-general-things-i-can-spot-check-if-i-am-seeing-a-problem

Upvotes: 0

Related Questions