为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
Qyouu 2022-12-19 19:21:59
我正在尝试构建我的 Golang 应用程序的 Dockerfile,其中包括 delve 调试器 - 我想在 Docker 容器中调试我的 Golang 应用程序。当我尝试构建我的 Docker 时,我总是出现以下错误:Step 5/9 : RUN go build -gcflags "all=-N -l" -o ./feedme ---> Running in a0579ec8a85cgo: 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.go0 directories, 4 files单个应用程序文件 parsedata-xml-fp.go(我将忽略它,因为我认为错误与它无关)我的文件:FROM golang:1.17 AS buildWORKDIR /COPY . .RUN go install github.com/go-delve/delve/cmd/dlv@latestRUN go build -gcflags "all=-N -l" -o ./feedmeEXPOSE 8000 2345 COPY --from=build /go/bin/dlv /dlvCOPY --from=build /feedme /feedmeCMD ["/dlv", "--listen=:2345", "--headless=true", "--api-version=2", "--accept-multiclient", "exec", "/feedme"]知道为什么会发生此错误,我该如何解决?我搜索了它并尝试设置一些环境变量:1) RUN GO111MODULE=off/on2) RUN CGO_ENABLED=0好像它们都不起作用
查看完整描述

1 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

我阅读了官方 Docker 文档:docs.docker.com/language/golang/以及多阶段构建博客


这是我想出的解决方案,我可以在本地启动我的 Go 应用程序容器


我的 Dockerfile:


FROM golang:1.17 AS build


WORKDIR /

COPY . .


RUN go mod init feedme

RUN go mod tidy


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

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

RUN echo $(ls /go/bin)


FROM gcr.io/distroless/base-debian10

WORKDIR /


EXPOSE 2345 


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

COPY --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 build


WORKDIR /

COPY go/app/parsedata-xml-fp.go .

COPY go.mod .   # just copy local go.mod

COPY go.sum .


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

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

RUN echo $(ls /go/bin)


FROM gcr.io/distroless/base-debian10

WORKDIR /


EXPOSE 2345 


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

COPY --from=build /feedme ~/feedme

#ENTRYPOINT [ "/dlv" ]

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



查看完整回答
反对 回复 2022-12-19
  • 1 回答
  • 0 关注
  • 277 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信