Week26 - 透过VSCode在Docker里头debugging Golang! [Server的终局之战系列]

本文章同时发布于:

MediumiT 邦帮忙

大家好,继上次Week25 - 用 Minecraft 来说明 Docker 为什么这么香 - Docker-Compose 篇的文章后,接下来要来介绍一下 Docker 在软体实战中的一些应用。

Docker 在实战中有个很实用的功能就是:

> 统一开发环境

就像Week22 - 用 Redis 来帮 Line bot 髒沙发设计一次性功能 - 实作篇,透过 Docker 可以快速建立一个有 Redis 的开发环境,让开发者专心于开发,而不是忙于架设 Redis。


在还没有 Docker 以前,关于怎么建立开发环境一直是个麻烦的问题,常见的作法就是请 Infra team 的人员统一建立一个 Development 的环境供大家开发,但如果有天有同事不小心把这个环境的 Redis 用爆了,就...

然后架设环境的 Infra team 就要加班了 QQ

所以用 Docker 建立一个「个人电脑上的环境」,无不是个好方法。

遇到的问题 - 在 Docker 里 debbuging

在 Docker 里面开发,环境上的确方便,不过在 Docker 里 debbuging,就变成了另一个问题。

而 Golang 针对这个问题的解决方案就是:

在 Docker 里设定一个对外的 debug port

实作

实作我们以 Golang Server 来讲解,

首先先 clone example code。

然后起动 Docker。

$ docker-compose up

我们会看到以下 log,代表 Docker 的环境已经启动完成,「但 Server 实际上还没启动,我们必须透过 VSCode Debug Mode 来启动」,

透过 Debug Mode 启动 Golang Server,

main.go 里头标注第 10 行,会看到 终端机 显示已经新增中断点的 log,

在浏览器进入localhost:8080时可以看到,Debug Mode 的中断点发挥的作用,

如何配置 Debug Mode

首先,Dockerfile 必须安装delve,这是 Golang 专门拿来「Remote(远端)」Debug 的工具,而这个远端就是指 Docker。

# DockerfileFROM golang:1.14-alpineWORKDIR /appCOPY . /appRUN apk add --no-cache g++ git# 安装 delveRUN go get github.com/go-delve/delve/cmd/dlv

接下来我们必须设定 docker-compose,解释我写在注解里,

# docker-compose.yamlversion: "3.5"services:  server:    build: .    working_dir: /app    volumes:      - .:/app    ports:      # Golang Server 的对外 8080 Port      - 8080:8080      # 由于 delve 的 Debug Port 是 6379,所以 Docker 必须要对外开放 6379 Port 供 VSCode 的 Debug Mode      - 6379:6379    # 会以 delve 来启动 Golang Server,而这个 Debug Port 是 6379    entrypoint: dlv debug --headless --listen=:6379 --log --api-version=2

最后是 Debug Mode 的设定档.vscode/launch.json

mode: 要开启 remote 模式remotePath: 在 Docker 里执行的路径host: 要被 Remote 端的 hostport: 要被 Remote 端的 portprogram: 程式档在本机执行的路径,可以选择 workspaceRoot 这个环境变数
{  "version": "0.2.0",  "configurations": [    {      "name": "Launch remote",      "type": "go",      "request": "launch",      "mode": "remote",      "remotePath": "/app",      "port": 6379,      "host": "127.0.0.1",      "program": "${workspaceRoot}",      "env": {}    }  ]}

设定好这些参数后,就可以在 Docker 里兼顾开发环境与 debugging 功能啦~


谢谢你的阅读,也欢迎分享讨论指正~

参考与引用资料

Golang 单步除错利器 — Delve. Golang 是一个静态语言,虽然也有支援… | by Charlie Chen | MediumDebugging Golang apps in Docker with Visual Studio Codevscode-go/docs/debugging.md

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章