我正在try 为我的Go项目构建一个Docker容器,但我一直遇到以下错误:

=> ERROR [backend-builder 5/5] RUN --mount=type=cache,mode=0777,target=/go/pkg/mod \
--mount=type=cache,mode=0777,target=/.cache/go-build \
CGO_ENABLED=0 GOOS=linux go build -o serve ./backend/cmd/main.go: \
#17 0.343 backend/cmd/main.go:10:2: no required module provides package \
github.com/LarsDepuydt/peno-entrepreneurship-3d-oclusion/backend/cmd/serve; \
to add it: \
#17 0.343 go get github.com/LarsDepuydt/peno-entrepreneurship-3d-oclusion/backend/cmd/serve \
------
executor failed running [/bin/sh -c CGO_ENABLED=0 GOOS=linux go build -o serve ./backend/cmd/main.go]: exit code: 1

我怀疑这个错误是因为我的main.go文件从我的项目中导入了一个名为SERVE的本地包.

这是我的项目 struct :

peno-entrepreneurship-3d-oclusion/
│
├── backend/
│   ├── cmd/
│   │   ├── main.go
│   │   └── serve/
│   │       └── serve.go
│   ├── go.mod
│   └── go.sum
│
├── Dockerfile
│
└── ... (other frontend files and directories)


这是我的IMPORT语句.转到:

import (
    "database/sql"
    "fmt"
    "log"
    "net/http"
    "os"

    "github.com/LarsDepuydt/peno-entrepreneurship-3d-oclusion/backend/cmd/serve"
)

这是我的 docker 文件:

################################
# Build backend
################################

FROM dev AS backend-builder

# Change the WORKDIR in the backend-builder stage
WORKDIR /usr/src/app

# pre-copy/cache go.mod for pre-downloading dependencies and only redownloading them in subsequent builds if they change
COPY ./backend/go.mod ./backend/go.sum ./
RUN --mount=type=cache,mode=0777,target=/go/pkg/mod go mod download
#RUN go get github.com/LarsDepuydt/peno-entrepreneurship-3d-oclusion/backend/cmd/serve

COPY . .

# Use native go packages (CGO_ENABLED)
RUN --mount=type=cache,mode=0777,target=/go/pkg/mod \
    --mount=type=cache,mode=0777,target=/.cache/go-build \
    CGO_ENABLED=0 GOOS=linux go build -o serve ./backend/cmd/main.go


有人能帮我解释一下这里出了什么问题吗?我已经try 了很多更改路径的方法,但都无法绕过这个错误.

在main.go中,我try 了这个:"./serve",而不是当前的导入.

我还try 了许多关于WORKDIR和docker文件中的路径的方法.但我一直收到相同的错误,似乎无法修复错误.

推荐答案

Dockerfile上,您可以使用以下脚本:

WORKDIR /usr/src/app
COPY ./backend/go.mod ./backend/go.sum ./
RUN --mount=type=cache,mode=0777,target=/go/pkg/mod go mod download

这样,go.mod文件就位于/usr/src/app下面,相同的路径将成为Go模块的根路径.

根据您的代码 struct ,go.mod应该位于/usr/src/app/backend以下,而不是/usr/src/app.

try 将脚本更改为以下脚本:

FROM dev AS backend-builder

WORKDIR /usr/src/app/backend
COPY ./backend/go.mod ./backend/go.sum ./
RUN --mount=type=cache,mode=0777,target=/go/pkg/mod go mod download

WORKDIR /usr/src/app
COPY . .

WORKDIR /usr/src/app/backend
RUN --mount=type=cache,mode=0777,target=/go/pkg/mod \
    --mount=type=cache,mode=0777,target=/.cache/go-build \
    CGO_ENABLED=0 GOOS=linux go build -o serve ./cmd/main.go

Go相关问答推荐

如何使用Docker Compose配置Go,使main. go文件位于/CMD文件夹中

如何使用GRPC UnaryClientInterceptor中的`maily`参数?

Go PQ驱动程序无法使用默认架构进行查询

如何在AWS SDK Go v2 STS上正确使用重试

[0]Func()as";请勿比较哨兵类型

链自定义GRPC客户端拦截器/DialOptions

包裹网.Conn导致挂起读取

Golang Gorm Fiber - 如何将定义为别名的名称发送到索引模板?

Go Gin:验证 base64

优化方式中所有可能组合的字符串相似度

Fizz对Gin的OpenAPI生成器正在重命名类型

以编程方式取消 pyspark dataproc 批处理作业(job)

自定义 Fyne 自适应网格布局

Apache Beam 在 Go 中从 PCollection 中 Select 前 N 行

拆分文本并按空格获取字符串数组,如果文本长度超过 500,则获取字符串数组

如何过滤来自 fsnotify 的重复系统消息

io.Pipe 使用困难

如何在Golang中的差异函数中杀死命令Exec

vs 代码调试 go 测试不通过标志

全局记录(across packages)