登录
首页 >  Golang >  Go问答

在 Dockerfile 和 docker-compose.yml 中编写什么代码以在 docker 环境中传递本地包

来源:stackoverflow

时间:2024-04-14 13:30:34 460浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《在 Dockerfile 和 docker-compose.yml 中编写什么代码以在 docker 环境中传递本地包》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

我引入了 local 包 go 模块 用于服务器端 api。

通过命令 go run main.go 在本地环境中可以正常运行,不会出现错误。

但是在命令docker-compose up时不起作用。

我想知道要对 dockerfile 和 docker-compose.yml 进行编码以修复哪些问题。

我在 article 目录中命令 go mod init

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

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
)

我希望服务器端 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)。 我希望有人给我 dockerfiledocker-compose.yml 的答案代码。 https://github.com/jpskgc/article/tree/try-golang-mod


解决方案


我通过以下方式解决了这个问题。

  1. 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
  1. 修复 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"]
  1. 命令 docker-compose down,然后命令 docker-compose up --build

您的 docker 上下文是 ./api,但 go.mod 位于父目录中,因此 go.mod 不包含在您的镜像中。

一种选择是将 docker 上下文更改为源树的根目录(api 的父目录),然后将文件/目录从那里复制到映像中。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《在 Dockerfile 和 docker-compose.yml 中编写什么代码以在 docker 环境中传递本地包》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>