在 Dockerfile 和 docker-compose.yml 中编写什么代码以在 docker

我介绍local package了go modules服务器端 api。

在本地环境下运行正常,通过命令不会报错go run main.go。


但在指挥的时候却不起作用docker-compose up。


我想知道要编写 Dockerfile 和 docker-compose.yml 来修复哪些问题。


go mod init我在目录下命令article。


结果,它设置module github.com/jpskgc/article在go.mod.


article

  ├ db

  ├ client

  ├ api

  │  ├ main.go

  │  ├ controller

  │  │    └ controller.go

  │  └ Dockerfile

  ├ nginx

  ├ docker-compose.yml

  ├ go.mod

  └ go.sum

主程序


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

)

我希望服务器端 api 在 docker 环境中正常工作,不会出现错误。

但实际情况是服务端的docker环境无法运行。


这是命令 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

这是 github 上的完整源代码(分支:try-golang-mod)。我希望有人给我Dockerfile和的答案代码docker-compose.yml。 https://github.com/jpskgc/article/tree/try-golang-mod


茅侃侃
浏览 119回答 2
2回答

动漫人物

您的 docker 上下文是 ./api,但 go.mod 位于父目录中,因此 go.mod 不包含在您的映像中。一种选择是将 docker 上下文更改为源树的根目录(api 的父目录),然后将文件/目录从那里复制到映像中。

交互式爱情

我通过以下方式解决这个问题。go mod init article/api在api目录。article  ├ client  ├ api  │  ├ main.go  │  ├ contoroller  │  │    └ contoroller.go  │  ├ //  │  ├ go.mod   │  ├ go.sum  │  └ Dockerfile  ├ nginx  ├ go.mod  ├ go.sum  └ docker-compose.yml使固定DocekrfileFROM golang:latestENV GO111MODULE=onWORKDIR /appCOPY go.mod .COPY go.sum .RUN go mod downloadCOPY . .RUN go buildRUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go buildENTRYPOINT ["/app/api"]命令docker-compose down然后docker-compose up --build
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go