有时候我们需要对容器内部进程进行debug,当然我们可以直接拷贝delve到容器进行命令行调试,

但是由于缺少源文件会导致无法看见调试的上下文代码,可以配置 ~/.config/dlv/config.yml 中的 substitute-path参数,不过这样就繁琐了。

在容器启动时就使用delve启动debug

1. 下载delve并以容器基础镜像的架构编译

wget https://github.com/go-delve/delve/archive/v1.5.1.zip
unzip v1.5.1.zip
cd delve-1.5.1
go build -o dlv cmd/dlv/main.go

2. 编写一个测试web程序 && 编译

package main

import (
	"fmt"
	"log"
	"net/http"
)

func IndexHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintln(w, "hello world")
}

func main() {
	http.HandleFunc("/", IndexHandler)
	log.Fatalln(http.ListenAndServe(":8000", nil))
}
export CGO_ENABLED=0 && export GOOS=linux && export GOARCH=mips64le && go build -o web main.go

3. 将刚刚dlv拷贝到当前目录 && 编写Dockerfile && 打包为image

FROM debian:latest

COPY ./web /web
COPY ./dlv /dlv
RUN chmod +x /web

EXPOSE 40000
EXPOSE 8000

CMD ["/dlv", "--listen=:40000", "--headless=true", "--api-version=2", "exec", "/web"]
docker build -t app:temp .

4. 启动容器

docker run --rm -it -p 2345:40000 -p 8000:8000 app:temp

5. goland 配置

  1. 如图进入debug配置页面

第一步

  1. 按图示点击左上角+号,选择go remote,右侧默认配置即可,点击确认

第二步

  1. 选中刚刚新增的debug配置,点击debug按钮,就可以像本地一样调试了

第三步

注意断开的话会导致无法再次连接delve服务端进行debug