英文:
Error building docker container due to local package import in main.go file
问题
我正在尝试为我的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的本地包所致。
这是我的项目结构:
peno-entrepreneurship-3d-oclusion/
│
├── backend/
│ ├── cmd/
│ │ ├── main.go
│ │ └── serve/
│ │ └── serve.go
│ ├── go.mod
│ └── go.sum
│
├── Dockerfile
│
└── ... (其他前端文件和目录)
这是我在main.go中的导入语句:
import (
"database/sql"
"fmt"
"log"
"net/http"
"os"
"github.com/LarsDepuydt/peno-entrepreneurship-3d-oclusion/backend/cmd/serve"
)
这是我的Dockerfile:
################################
# Build backend
################################
FROM dev AS backend-builder
# 在backend-builder阶段更改WORKDIR
WORKDIR /usr/src/app
# 预先复制/缓存go.mod以预先下载依赖项,并仅在后续构建中更改时重新下载它们
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 . .
# 使用本机go包(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
有人可以帮助我解释这里出了什么问题吗?我尝试了很多改变路径的方法,但是无法解决这个错误。
在main.go中,我尝试了这个:"./serve"
,而不是当前的导入方式。
我还尝试了很多关于WORKDIR和docker文件中路径的方法。但是我一直收到相同的错误,无法解决这个错误。
英文:
I am trying to build a Docker container for my Go project, but I keep encountering the following error:
=> 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
I suspect that the error is caused by the fact that my main.go file imports a local package called serve from my project.
This is my project structure:
peno-entrepreneurship-3d-oclusion/
│
├── backend/
│ ├── cmd/
│ │ ├── main.go
│ │ └── serve/
│ │ └── serve.go
│ ├── go.mod
│ └── go.sum
│
├── Dockerfile
│
└── ... (other frontend files and directories)
This is my import statement in my main.go:
import (
"database/sql"
"fmt"
"log"
"net/http"
"os"
"github.com/LarsDepuydt/peno-entrepreneurship-3d-oclusion/backend/cmd/serve"
)
This is my docker file:
################################
# 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
Could someone please help me explain what goes wrong here? I have tried a lot of things with changing the path but can't get around this error.
In main.go I tried this: "./serve"
instead of the current import.
I also tried many things regarding the WORKDIR and the path in the docker file. But I keep getting the same error and can't seem to fix the error.
答案1
得分: 1
在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.mod
应该位于/usr/src/app/backend
下,而不是/usr/src/app
下。
尝试将脚本更改为以下内容:
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
英文:
On the Dockerfile
, you use the following scripts:
WORKDIR /usr/src/app
COPY ./backend/go.mod ./backend/go.sum ./
RUN --mount=type=cache,mode=0777,target=/go/pkg/mod go mod download
With that, the go.mod
file is located right under /usr/src/app
, and the same path will become the root path of your go module.
Based on your code structure, the go.mod
should be located under /usr/src/app/backend
, NOT in /usr/src/app
.
Try to change the script to this one below:
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论