簡體   English   中英

在 Dockerfile 和 docker-compose.yml 中編寫什么代碼以在 docker 環境中傳遞本地包

[英]What to code in Dockerfile and docker-compose.yml to pass local package in docker environment

我為服務器端 api 引入了帶有go modules local package
通過命令go run main.go可以在本地環境中正常工作而不會出錯。

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

我想知道如何編碼 Dockerfile 和 docker-compose.yml 來修復。

我在article目錄下命令go mod init

結果,它在go.mod設置了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

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")
}

文件

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

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

一種選擇是將您的 docker 上下文更改為源樹的根目錄(api 的父目錄),並將文件/目錄從那里復制到圖像中。

我通過以下方式解決了這個問題。

  1. go mod init article/api api目錄中的go mod init article/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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM