我正在尝试使用内置的 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
前者不会列出任何需要动态加载的库,后者会列出它们。
- 1 回答
- 0 关注
- 109 浏览
添加回答
举报
0/150
提交
取消