Golang中Docker构建失败问题排查与解决
Golang中Docker构建失败问题排查与解决 大家好,希望我在这里发帖是合适的,如果有人知道这个可能很简单的问题的答案的话。 我是Go和Docker的初学者。我写了一个简单的Web应用,它连接到GCP上的一个MySQL PaaS服务。当我在本地运行代码时,它工作正常。我想将这个应用容器化并以容器方式运行。 我遇到了以下错误: main.go:16:5: cannot find package “go-sql-driver/mysql” in any of: ** /usr/local/go/src/go-sql-driver/mysql (from $GOROOT)** ** /go/src/go-sql-driver/mysql (from $GOPATH)** The command ‘/bin/sh -c CGO_ENABLED=0 go build -o /bin/demo’ returned a non-zero code: 1
对应的Dockerfile如下:
FROM golang:1.11-alpine AS build
WORKDIR /src/
COPY main.go /form/ /src/
RUN apk update -qq && apk add git
RUN go get -d github.com/go-sql-driver/mysql
RUN CGO_ENABLED=0 go build -o /bin/demo
FROM scratch
COPY --from=build /bin/demo /bin/demo
ENTRYPOINT ["/bin/demo"]
感谢任何能阻止我发疯的建议!
更多关于Golang中Docker构建失败问题排查与解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你的代码使用模块吗?为什么使用这么旧的Go镜像?
更多关于Golang中Docker构建失败问题排查与解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
很明显容器中没有mysql驱动,你在创建容器时安装驱动了吗?
有一个关于使用模块的好问题,您是在使用模块,还是有什么原因不使用而采用基于GOPATH的方式来安装东西?
更新。通过以下方法使其正常工作。现在我想着手进行从零开始的构建。
FROM golang:1.11-alpine AS build
WORKDIR /src/
COPY . /src/
RUN apk update -qq && apk add git
RUN go get "github.com/go-sql-driver/mysql"
CMD go run /main.go
无法运行。当我运行容器时,出现以下错误。
C:\Users\sesa82231\Desktop\Ant\go\testapi>docker container run -p 8080:8080 testapi main.go:16:5: cannot find package "go-sql-driver/mysql" in any of: /usr/local/go/src/go-sql-driver/mysql (from $GOROOT) /go/src/go-sql-driver/mysql (from $GOPATH)
感谢您的回复。由于这是我第一次进行此类操作,我想我需要一些帮助来完成这个Dockerfile。
FROM golang:1.11-alpine AS build
WORKDIR /src/
COPY main.go /form/* /src/
RUN apk update -qq && apk add git
RUN go get -d github.com/go-sql-driver/mysql
RUN CGO_ENABLED=0 go build -o /bin/demo
FROM scratch
COPY --from=build /bin/demo /bin/demo
ENTRYPOINT ["/bin/demo"]
我认为这是相关的代码。
import (
"database/sql"
"log"
"net/http"
"text/template"
_ "github.com/go-sql-driver/mysql"
)
func dbConn() (db *sql.DB) {
dbDriver := "mysql"
dbUser := "root"
dbPass := "qwerty"
dbName := "go"
db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@tcp(1.2.3.4:3306)/"+dbName)
if err != nil {
panic(err.Error())
}
return db
}
这是一个典型的Go模块依赖问题。你的Dockerfile没有正确配置Go模块。以下是修复后的Dockerfile:
FROM golang:1.21-alpine AS build
WORKDIR /app
# 启用Go模块并设置代理(可选)
ENV GO111MODULE=on \
GOPROXY=https://goproxy.cn,direct
# 复制go.mod和go.sum文件(如果存在)
COPY go.mod go.sum ./
# 下载依赖
RUN go mod download
# 复制源代码
COPY . .
# 构建应用
RUN CGO_ENABLED=0 GOOS=linux go build -o /app/main .
FROM alpine:latest
WORKDIR /root/
# 复制可执行文件
COPY --from=build /app/main .
# 运行应用
CMD ["./main"]
如果你的项目还没有go.mod文件,需要在本地先初始化模块:
# 在项目根目录执行
go mod init your-module-name
go mod tidy
然后更新你的Dockerfile,确保复制所有必要的文件:
FROM golang:1.21-alpine AS build
WORKDIR /app
# 复制所有文件
COPY . .
# 下载依赖并构建
RUN go mod download && \
CGO_ENABLED=0 GOOS=linux go build -o main .
FROM alpine:latest
WORKDIR /root/
COPY --from=build /app/main .
CMD ["./main"]
关键点:
- 使用
go mod管理依赖而不是go get - 确保复制
go.mod和go.sum文件 - 使用更新的Go基础镜像(1.11已经过时)
- 明确设置
GO111MODULE=on确保模块支持
如果你的main.go文件在子目录中,需要调整构建命令:
RUN CGO_ENABLED=0 GOOS=linux go build -o main ./cmd/your-app
其中./cmd/your-app是你的main.go所在目录。

