首页 > 解决方案 > $GOPATH/go.mod 存在但不应该在 Docker 上

问题描述

我正在尝试构建一个包含 MySQL 和 Go 服务器的 Docker 容器。

仅导入 MySQL 库会导致错误。

任何指向我做错了什么的指针?

这是构建后的终端:

Successfully built 5d5356e2ca72
Successfully tagged test3:latest
$GOPATH/go.mod exists but should not

但是 $GOPATH 中没有 go.mod

$ ls -a $GOPATH
.  ..  bin  pkg

这是 Go 服务器:

package main

import (
    "database/sql"
    "flag"
    "fmt"
    "log"
    "net/http"
    "strings"

    _ "github.com/go-sql-driver/mysql"
)

type FileSystem struct {
    fs http.FileSystem
}

var listen = flag.String("listen", ":8989", "listen address")
var dir = flag.String("dir", ".", "directory to serve")

func main() {
    db()
    flag.Parse()
    directory := "./"

    fileServer := http.FileServer(FileSystem{http.Dir(directory)})
    http.Handle("/", fileServer)

    fmt.Printf("Web server running. Listening on %q", *listen)
    err := http.ListenAndServe(*listen, http.FileServer(http.Dir(*dir)))
    fmt.Printf("%v\n", err)
}

func (fs FileSystem) Open(path string) (http.File, error) {
    f, err := fs.fs.Open(path)
    if err != nil {
        return nil, err
    }

    s, err := f.Stat()
    if s.IsDir() {
        index := strings.TrimSuffix(path, "/") + "/index.html"
        if _, err := fs.fs.Open(index); err != nil {
            return nil, err
        }
    }

    return f, nil
}

func db() {
    db, err := sql.Open("mysql", "root:root@tcp(192.168.0.33:4200)/mysql")
    if err != nil {
        log.Print(err.Error())
    } else {
        log.Print("DB connected successfully")
    }

    defer db.Close()
}

这是我的 go.mod

module test3

go 1.14

require github.com/go-sql-driver/mysql v1.5.0

这是 Dockerfile

FROM golang:alpine AS builder

ENV GO111MODULE=auto \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64   

COPY . .
COPY ./server.go .
COPY ./favicon.ico .
COPY ./assets /assets
EXPOSE 8989
CMD ["go", "run", "./server.go"]

这就是我构建容器的方式:

docker rmi test3 -f
docker build --no-cache -t test3 . 
docker run -p 8989:8989 test3

标签: mysqldockergo

解决方案


$GOPATH/go.mod 存在但不应该

默认情况下,goland:alpine映像启动GOPATH(即/gogo install )文件夹中的工作目录,在该文件夹中使用命令创建全局安装的包。

文件夹结构如下所示:

去/

  • 垃圾桶/
  • 源/
  • 包/

通过直接将go.mod复制到工作目录(即 GOPATH,即/go),golang 工具包会抛出错误,因为go.mod应该在包文件夹中。

在版本 1.11 中发布 Go 模块之前,约定是在/go/src文件夹中创建包。但是,随着 Go 模块的发布,您可以在任何地方创建 golang 包,只要它们包含go.mod文件即可。

因此,要修复错误,您可以将 golang 文件(go.mod等)复制到/home/app/go/src/app下的文件夹中。

复制到/home/app

RUN mkdir ../home/app 
WORKDIR /../home/app
COPY . .

复制到/go/src/app

RUN mkdir src/app
WORKDIR /src/app
COPY . .

推荐阅读