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

使用 delve 在容器中调试 Golang:

使用 delve 在容器中调试 Golang:

Go
Cats萌萌 2022-12-26 10:03:51
我正在尝试使用内置的 Golang 调试 delve 将我自己的调试版本 Golang 应用程序容器化。这是我如何在本地调试我的 Golang 应用程序,它是一个非常简单的 RSS 阅读器。它从我感兴趣的 RSS 提要中检索数据。$on my local terminal$ dlv debug parsedata-xml-fp.go  # launch my app with delveType 'help' for list of commands.(dlv) b mainCommand failed: Location "main" ambiguous: main.main, runtime.main…(dlv) b main.mainBreakpoint 1 set at 0x760252 for main.main() ./parsedata-xml-fp.go:50(dlv) c> main.main() ./parsedata-xml-fp.go:50 (hits goroutine(1):1 total:1) (PC: 0x760252)=>  50: func main() {    51:         // [decode from response.Body]    52:         url := "https://foreignpolicy.com/feed/"    53:    54:         var URLset Rss    55:         if xmlBytes, err := getXML(url); err != nil {(dlv) l> main.main() ./parsedata-xml-fp.go:50 (hits goroutine(1):1 total:1) (PC: 0x760252)=>  50: func main() {    51:         // [decode from response.Body]    52:         url := "https://foreignpolicy.com/feed/"    53:    54:         var URLset Rss    55:         if xmlBytes, err := getXML(url); err != nil {(dlv) 在我的本地机器上,我可以设置断点并进入我感兴趣的函数。我试图在我建造的容器内做同样的事情。选项 #1: 下面是我的容器的 Dockerfile#Dockerfile.dlvFROM golang:1.17 AS buildWORKDIR /COPY go/app/parsedata-xml-fp.go .COPY go.mod .COPY 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)# stage 2 build FROM ubuntu:18.04WORKDIR /EXPOSE 2345 COPY --from=build /go/bin/dlv /dlvCOPY --from=build /feedme /feedmeCOPY --from=build /parsedata-xml-fp.go /parsedata-xml-fp.goCMD ["/dlv", "--listen=:2345", "--headless=true", "--api-version=2", "--accept-multiclient", "exec", "/feedme"]当启动我的容器并登录时,出现错误:exec: "go": executable file not found in $PATH
查看完整描述

1 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

问题在于您的dlv二进制文件被动态编译。当您使用 下载二进制文件时go install,默认情况下它会下载CGO_ENABLED=1(除非被覆盖),需要在运行时加载大部分运行时库(包括 glibc)。这在某些不存在库的容器镜像中可能效果不佳(例如从头构建的镜像/无发行版静态镜像)。

因此,为了避免与容器镜像的依赖关系,请始终通过将上述标志设置为 0 来下载静态编译的镜像。在您的 docker 上下文中使用下载的二进制文件

CGO_ENABLED=0 go install github.com/go-delve/delve/cmd/dlv@latest

您还可以观察静态和动态编译版本之间的ldd输出。dlv前者不会列出任何需要动态加载的库,后者会列出它们。


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

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号