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

8 回复

你的代码使用模块吗?为什么使用这么旧的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"]

关键点:

  1. 使用go mod管理依赖而不是go get
  2. 确保复制go.modgo.sum文件
  3. 使用更新的Go基础镜像(1.11已经过时)
  4. 明确设置GO111MODULE=on确保模块支持

如果你的main.go文件在子目录中,需要调整构建命令:

RUN CGO_ENABLED=0 GOOS=linux go build -o main ./cmd/your-app

其中./cmd/your-app是你的main.go所在目录。

回到顶部