猿问

使用 delve 在容器中调试 Golang:

我正在尝试使用内置的 Golang 调试 delve 将我自己的调试版本 Golang 应用程序容器化。这是我如何在本地调试我的 Golang 应用程序,它是一个非常简单的 RSS 阅读器。它从我感兴趣的 RSS 提要中检索数据。


$on my local terminal$ dlv debug parsedata-xml-fp.go  # launch my app with delve

Type 'help' for list of commands.

(dlv) b main

Command failed: Location "main" ambiguous: main.main, runtime.main…

(dlv) b main.main

Breakpoint 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.dlv

FROM golang:1.17 AS build


WORKDIR /

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

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


# stage 2 build 

FROM ubuntu:18.04

WORKDIR /


EXPOSE 2345 


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

COPY --from=build /feedme /feedme

COPY --from=build /parsedata-xml-fp.go /parsedata-xml-fp.go

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

当启动我的容器并登录时,出现错误:


exec: "go": executable file not found in $PATH

Cats萌萌
浏览 111回答 1
1回答

函数式编程

问题在于您的dlv二进制文件被动态编译。当您使用 下载二进制文件时go install,默认情况下它会下载CGO_ENABLED=1(除非被覆盖),需要在运行时加载大部分运行时库(包括 glibc)。这在某些不存在库的容器镜像中可能效果不佳(例如从头构建的镜像/无发行版静态镜像)。因此,为了避免与容器镜像的依赖关系,请始终通过将上述标志设置为 0 来下载静态编译的镜像。在您的 docker 上下文中使用下载的二进制文件CGO_ENABLED=0 go install github.com/go-delve/delve/cmd/dlv@latest您还可以观察静态和动态编译版本之间的ldd输出。dlv前者不会列出任何需要动态加载的库,后者会列出它们。
随时随地看视频慕课网APP

相关分类

Go
我要回答