Debug in container
有时候我们需要对容器内部进程进行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 配置
- 如图进入debug配置页面
- 按图示点击左上角+号,选择go remote,右侧默认配置即可,点击确认
- 选中刚刚新增的debug配置,点击debug按钮,就可以像本地一样调试了
注意断开的话会导致无法再次连接delve服务端进行debug