mysql - $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
解决方案
$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 . .