Docker 构建:“go: 在当前目录或任何父目录中找不到 go.mod 文件”

我正在尝试构建我的 Golang 应用程序的 Dockerfile,其中包括 delve 调试器 - 我想在 Docker 容器中调试我的 Golang 应用程序。


当我尝试构建我的 Docker 时,我总是出现以下错误:


Step 5/9 : RUN go build -gcflags "all=-N -l" -o ./feedme

 ---> Running in a0579ec8a85c

go: go.mod file not found in current directory or any parent directory; see 'go help modules'

命令 go build 在我的本地文件夹上运行良好(请参阅下面的树命令)


go build -gcflags "all=-N -l" -o ./feedme

这是我的文件夹结构和文件:


tree

.

├── Dockerfile

├── Makefile

├── docker-compose.yml

└── parsedata-xml-fp.go


0 directories, 4 files

单个应用程序文件 parsedata-xml-fp.go(我将忽略它,因为我认为错误与它无关)


我的文件:


FROM golang:1.17 AS build

WORKDIR /

COPY . .

RUN go install github.com/go-delve/delve/cmd/dlv@latest

RUN go build -gcflags "all=-N -l" -o ./feedme


EXPOSE 8000 2345 


COPY --from=build /go/bin/dlv /dlv

COPY --from=build /feedme /feedme


CMD ["/dlv", "--listen=:2345", "--headless=true", "--api-version=2", "--accept-multiclient", "exec", "/feedme"]

知道为什么会发生此错误,我该如何解决?我搜索了它并尝试设置一些环境变量:


1) RUN GO111MODULE=off/on

2) RUN CGO_ENABLED=0

好像它们都不起作用


Qyouu
浏览 298回答 1
1回答

慕婉清6462132

我阅读了官方 Docker 文档:docs.docker.com/language/golang/以及多阶段构建博客这是我想出的解决方案,我可以在本地启动我的 Go 应用程序容器我的 Dockerfile:FROM golang:1.17 AS buildWORKDIR /COPY . .RUN go mod init feedmeRUN go mod tidyRUN go install github.com/go-delve/delve/cmd/dlv@latestRUN go build -gcflags="all=-N -l" -o /feedmeRUN echo $(ls /go/bin)FROM gcr.io/distroless/base-debian10WORKDIR /EXPOSE 2345&nbsp;COPY --from=build /go/bin/dlv /dlvCOPY --from=build /feedme ~/feedme#ENTRYPOINT [ "/dlv" ]CMD ["/dlv", "--listen=:2345", "--headless=true", "--api-version=2", "--accept-multiclient", "exec", "~/feedme"]我使用以下方式启动我的容器:docker run -p 2345:2345 <docker image ID>然后我试着卷曲它,它确实有反应:curl http://localhost:2345[编辑]根据 TheFool 的建议,我直接在我的容器中使用了 go.mod 和 go.sum 的本地副本。将它从我的本地工作区复制到容器,(而不是在容器中生成 go.mod)以避免将来出现任何意外:这是Dockerfile的改进版本FROM golang:1.17 AS buildWORKDIR /COPY go/app/parsedata-xml-fp.go .COPY go.mod .&nbsp; &nbsp;# just copy local go.modCOPY go.sum .RUN go install github.com/go-delve/delve/cmd/dlv@latestRUN go build -gcflags="all=-N -l" -o /feedmeRUN echo $(ls /go/bin)FROM gcr.io/distroless/base-debian10WORKDIR /EXPOSE 2345&nbsp;COPY --from=build /go/bin/dlv /dlvCOPY --from=build /feedme ~/feedme#ENTRYPOINT [ "/dlv" ]CMD ["/dlv", "--listen=:2345", "--headless=true", "--api-version=2", "--accept-multiclient", "exec", "~/feedme"]
打开App,查看更多内容
随时随地看视频慕课网APP