我正在嘗試使用內(nèi)置的 Golang 調(diào)試 delve 將我自己的調(diào)試版本 Golang 應(yīng)用程序容器化。這是我如何在本地調(diào)試我的 Golang 應(yīng)用程序,它是一個非常簡單的 RSS 閱讀器。它從我感興趣的 RSS 提要中檢索數(shù)據(jù)。$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) 在我的本地機器上,我可以設(shè)置斷點并進入我感興趣的函數(shù)。我試圖在我建造的容器內(nèi)做同樣的事情。選項 #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"]當啟動我的容器并登錄時,出現(xiàn)錯誤:exec: "go": executable file not found in $PATH
1 回答

函數(shù)式編程
TA貢獻1807條經(jīng)驗 獲得超9個贊
問題在于您的dlv
二進制文件被動態(tài)編譯。當您使用 下載二進制文件時go install
,默認情況下它會下載CGO_ENABLED=1
(除非被覆蓋),需要在運行時加載大部分運行時庫(包括 glibc)。這在某些不存在庫的容器鏡像中可能效果不佳(例如從頭構(gòu)建的鏡像/無發(fā)行版靜態(tài)鏡像)。
因此,為了避免與容器鏡像的依賴關(guān)系,請始終通過將上述標志設(shè)置為 0 來下載靜態(tài)編譯的鏡像。在您的 docker 上下文中使用下載的二進制文件
CGO_ENABLED=0 go install github.com/go-delve/delve/cmd/dlv@latest
您還可以觀察靜態(tài)和動態(tài)編譯版本之間的ldd
輸出。dlv
前者不會列出任何需要動態(tài)加載的庫,后者會列出它們。
- 1 回答
- 0 關(guān)注
- 143 瀏覽
添加回答
舉報
0/150
提交
取消