封面图片由作者提供
对于开发人员而言,调试是软件开发中至关重要且具有挑战性的方面。这就像是一名侦探,寻找线索并拼凑出代码出错的故事。但是,就像任何侦探故事一样,这也是一项挑战。在容器化环境(如 Docker)中进行调试会增加一层复杂性。然而,通过正确的工具和方法,使用 Visual Studio Code 在 Docker 容器中调试 Go 应用程序可以变得简单而有成效。
Go,也称为 Golang,是一种功能强大的开源编程语言,以其简单性、效率和可靠性而闻名。但是,当涉及到部署和管理应用程序时,有一个更好的解决方案——Docker 容器,特别是在微服务继续流行的情况下。Docker 容器为你的 Go 应用程序提供了标准化、隔离的环境,使部署和管理变得轻松。
在本文中,你将探索如何使用 Visual Studio Code 在 Docker 容器中调试 Go 应用程序。本文将涵盖设置调试器所需的必要步骤,并演示使用 docker 和 docker-compose 调试 Go 应用程序的过程。通过本文的学习,你应该更好地理解如何使用 Visual Studio Code 在 Docker 容器中调试 Go 应用程序。
因此,如果你准备好提升调试技能,让开发人员的生活更轻松,请继续阅读!你不会后悔的。
先决条件
- Golang 1.16 或更高版本
- Docker
- Visual Studio Code
设置
首先,确保已安装所有先决条件。完成后,继续设置项目。在本文中,我们将使用 gofiber 作为样例应用程序,以调试 Go 应用程序。按照以下步骤操作:
- 创建应用程序文件夹
mkdir go-debugger && cd go-debugger
- 将以下内容添加到
Dockerfile
文件中
# syntax=docker/dockerfile:1
FROM golang:1.18-alpine
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o go-debugger .
EXPOSE 3000
CMD ["/app/go-debugger"]
- 从代码构建映像
docker build --tag go-debugger-image .
- 完成构建后,可以通过在终端中运行以下命令来验证它
docker images --filter "reference=go-debugger-image"
它将显示有关你创建的本地映像的信息,信息应如下
搜索 docker 映像。图片由作者提供
- 在检查映像后,让我们使用此命令将你的映像作为容器运行
docker run -d -p 3000:3000 --name go-debugger-container go-debugger-image
- 使用以下命令验证容器是否成功运行
docker ps --filter "name=go-debugger-container"
显示的信息应如下
搜索 docker 容器。图片由作者提供
- 打开
http://localhost:3000/
进行检查,该页面将向你显示以下内容
测试 API。图片由作者提供
但是如何进行调试呢?
非常好,验证一切都运行正常!现在,让我们进一步调试 Docker 容器内的应用程序。但在我们深入调试之前,我们需要为调试目的创建一个专门的 Dockerfile 版本。这样,我们将拥有一个“正常”的 Dockerfile,以通常的方式运行应用程序,而不需要使用调试模式。
为什么需要分离 Dockerfile?我们正在使用名为 delve 的第三方软件包,以使我们能够在 Docker 容器内调试 Go 应用程序。由于我们正在使用外部软件包,因此我们需要以不同的方式配置 Docker 映像,以确保 delve 正常工作。
因此,让我们准备好调试我们的应用程序并解开容器中潜藏的任何问题!
- 让我们为仅调试创建一个 dockerfile
touch Dockerfile.debug
- 将以下内容添加到
Dockerfile.debug
文件中
FROM golang:1.18-alpine
EXPOSE 3000 4000
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go install -ldflags "-s -w -extldflags '-static'" github.com/go-delve/delve/cmd/dlv@latest
RUN CGO_ENABLED=0 go build -gcflags "all=-N -l" -o go-debugger .
CMD [ "/go/bin/dlv", "--listen=:4000", "--headless=true", "--log=true", "--accept-multiclient", "--api-version=2", "exec", "/app/go-debugger" ]
这里有一些命令,你必须注意:
--listen=:4000
这将是你的调试器(delve)监听的端口。这就是为什么我们在EXPOSE 3000 4000
中公开了 2 个端口CGO_ENABLED=0
是必需的,以避免 delve 配置成 动态 编译-gcflags=all="-N -l"
用于禁用内联和优化,因为它可能会 干扰 调试过程
- 接下来,必须使用
Dockerfile.debug
配置构建新映像
docker build --file Dockerfile.debug --tag go-debugger-image .
- 构建映像完成后,下一步是删除先前的容器,因为我们不能拥有相同名称的 2 个容器
docker container rm go-debugger-container
- 删除后,让我们将映像作为容器运行
docker run -d -p 3000:3000 -p 4000:4000 --name go-debugger-container go-debugger-image
- 成功运行容器后,现在让我们在 VS Code 中准备调试器
创建调试器配置。图片由作者提供
- 然后,你将获得一个
launch.json
,将以下内容添加到其中
{
"version": "0.2.0",
"configurations": [{
"name": "Go Containerized Debug",
"type": "go",
"request": "attach",
"mode": "remote",
"port": 4000,
"host": "127.0.0.1"
}]
}
- 现在,让我们尝试设置一些断点并运行调试器
设置断点并运行调试器。图片由作者提供
- 运行调试器后,让我们通过打开
http://localhost:3000/test
来进行验证。它应该会自动重定向到你的 VS Code,如下所示
调试流程。图片由作者提供
太棒了!你已经成功地在 Docker 容器中设置了调试代码。现在,准备深入代码,找出一些隐藏的顽固 bug!
使用 Docker Compose 进行专业调试
但等等……如果你想将其提升到下一个级别,并使用 Docker Compose 运行你的应用程序呢?毕竟,许多现代开发工作流程都依赖于容器管理。别担心!使用 Docker Compose 进行设置就像吃蛋糕一样容易,我来告诉你如何做。让我们开始吧!
-
确保没有应用程序将使用我们在
Dockerfile.debug
中暴露的端口。在这种情况下,你暴露了 3000 和 4000 端口。如果有一个应用程序使用了该端口,请停止它 -
让我们使用命令创建
docker-compose.yml
touch docker-compose.yml
- 将以下内容添加到你的
docker-compose.yml
中
version: "3.9"
services:
app:
build:
context: .
dockerfile: Dockerfile.debug
ports:
- "3000:3000"
- "4000:4000"
- 现在,让我们使用命令创建并运行容器
docker compose up
- 现在,像第 8 步一样在 VS Code 中运行调试器
设置断点并运行调试器。图片由作者提供
- 通过打开 URL
http://localhost:3000/test
来验证调试,并且它会重定向到 VS Code,如下所示
调试流程。图片由作者提供
太棒了!使用 Docker Compose,你已经准备好将调试技能提升到下一个级别。通过利用这个强大的工具,你将能够更有效地管理容器并简化开发工作流程。无论你处理复杂的代码还是简单地想要提高调试能力,Docker Compose 都是你武器库中的一个绝佳工具。那么,你还在等什么?现在是时候像专业人士一样进行调试了!
结论
这是你所读过的博客文章的总结
- 使用第三方包 Delve,可以在 Golang 中进行调试
- 你可以在 docker 和 docker-compose 上使用 delve 调试应用程序,需要做一些额外的工作
- 我建议将“普通”Dockerfile 和“调试”Dockerfile 分开,因为有一个自定义配置使 Delve 运行顺畅,并且更改环境变得更容易。
参考
- 完整的代码存储库
- VS Code Golang 调试指南 guide
- Delve 使用指南 guide
- CGO_ENABLED issue 、 原始发布于 https://www.kenaqshal.com,日期为 2023 年 3 月 7 日。
译自:https://levelup.gitconnected.com/debugging-dockerized-go-applications-with-vs-code-26b48e9c806b
评论(0)