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 what to code Dockerfile and docker-compose.yml to fix.
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-gonic/gin"
"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 /go/src/github.com/jpskgc/article/app
COPY . .
RUN go mod download
RUN go build
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
ENTRYPOINT ["/go/src/github.com/jpskgc/article/app/api"]
docker-compose.yml
version: '3'
services:
api:
build:
dockerfile: Dockerfile.dev
context: ./api
volumes:
- ./api:/go/src/github.com/jpskgc/article/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
build command-line-arguments:
cannot load github.com/jpskgc/article/api/controller:
cannot find module providing package github.com/jpskgc/article/api/controller
article_api_1 exited with code 1
Here is the entire source code on github (branch: try-golang-mod). I wish someone to give me answer code for Dockerfile
and docker-compose.yml
. https://github.com/jpskgc/article/tree/try-golang-mod
Your docker context is ./api, but the go.mod is in the parent directory, so go.mod is not included in your image.
One option could be to change your docker context to the root directory of the source tree (parent of api), and copy the files/directories into the image from there.
I resolve this issue in following way.
go mod init article/api
at api
directory. article
├ client
├ api
│ ├ main.go
│ ├ contoroller
│ │ └ contoroller.go
│ ├ //
│ ├ go.mod
│ ├ go.sum
│ └ Dockerfile
├ nginx
├ go.mod
├ go.sum
└ docker-compose.yml
Docekrfile
FROM golang:latest
ENV GO111MODULE=on
WORKDIR /app
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN go build
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
ENTRYPOINT ["/app/api"]
docker-compose down
and then docker-compose up --build
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.