首页
Preview

使用 VS Code 调试 Docker 化的 Go 应用程序

封面图片由作者提供

对于开发人员而言,调试是软件开发中至关重要且具有挑战性的方面。这就像是一名侦探,寻找线索并拼凑出代码出错的故事。但是,就像任何侦探故事一样,这也是一项挑战。在容器化环境(如 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
  1. 将以下内容添加到 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"]
  1. 从代码构建映像
docker build --tag go-debugger-image .
  1. 完成构建后,可以通过在终端中运行以下命令来验证它
docker images --filter "reference=go-debugger-image"

它将显示有关你创建的本地映像的信息,信息应如下

搜索 docker 映像。图片由作者提供

  1. 在检查映像后,让我们使用此命令将你的映像作为容器运行
docker run -d -p 3000:3000 --name go-debugger-container go-debugger-image
  1. 使用以下命令验证容器是否成功运行
docker ps --filter "name=go-debugger-container"

显示的信息应如下

搜索 docker 容器。图片由作者提供

  1. 打开 http://localhost:3000/ 进行检查,该页面将向你显示以下内容

测试 API。图片由作者提供

但是如何进行调试呢?

非常好,验证一切都运行正常!现在,让我们进一步调试 Docker 容器内的应用程序。但在我们深入调试之前,我们需要为调试目的创建一个专门的 Dockerfile 版本。这样,我们将拥有一个“正常”的 Dockerfile,以通常的方式运行应用程序,而不需要使用调试模式。

为什么需要分离 Dockerfile?我们正在使用名为 delve 的第三方软件包,以使我们能够在 Docker 容器内调试 Go 应用程序。由于我们正在使用外部软件包,因此我们需要以不同的方式配置 Docker 映像,以确保 delve 正常工作。

因此,让我们准备好调试我们的应用程序并解开容器中潜藏的任何问题!

  • 让我们为仅调试创建一个 dockerfile
touch Dockerfile.debug
  1. 将以下内容添加到 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" 用于禁用内联和优化,因为它可能会 干扰 调试过程
  1. 接下来,必须使用 Dockerfile.debug 配置构建新映像
docker build --file Dockerfile.debug --tag go-debugger-image . 
  1. 构建映像完成后,下一步是删除先前的容器,因为我们不能拥有相同名称的 2 个容器
docker container rm go-debugger-container
  1. 删除后,让我们将映像作为容器运行
docker run -d -p 3000:3000 -p 4000:4000 --name  go-debugger-container go-debugger-image
  1. 成功运行容器后,现在让我们在 VS Code 中准备调试器

创建调试器配置。图片由作者提供

  1. 然后,你将获得一个 launch.json,将以下内容添加到其中
{
    "version": "0.2.0",
    "configurations": [{
        "name": "Go Containerized Debug",
        "type": "go",
        "request": "attach",
        "mode": "remote",
        "port": 4000,
        "host": "127.0.0.1"
    }]
}
  1. 现在,让我们尝试设置一些断点并运行调试器

设置断点并运行调试器。图片由作者提供

  1. 运行调试器后,让我们通过打开 http://localhost:3000/test 来进行验证。它应该会自动重定向到你的 VS Code,如下所示

调试流程。图片由作者提供

太棒了!你已经成功地在 Docker 容器中设置了调试代码。现在,准备深入代码,找出一些隐藏的顽固 bug!

使用 Docker Compose 进行专业调试

但等等……如果你想将其提升到下一个级别,并使用 Docker Compose 运行你的应用程序呢?毕竟,许多现代开发工作流程都依赖于容器管理。别担心!使用 Docker Compose 进行设置就像吃蛋糕一样容易,我来告诉你如何做。让我们开始吧!

  1. 确保没有应用程序将使用我们在 Dockerfile.debug 中暴露的端口。在这种情况下,你暴露了 3000 和 4000 端口。如果有一个应用程序使用了该端口,请停止它

  2. 让我们使用命令创建 docker-compose.yml

touch docker-compose.yml
  1. 将以下内容添加到你的 docker-compose.yml
version: "3.9"
services:
  app:
    build: 
      context: .
      dockerfile: Dockerfile.debug
    ports:
      - "3000:3000"
      - "4000:4000"
  1. 现在,让我们使用命令创建并运行容器
docker compose up
  1. 现在,像第 8 步一样在 VS Code 中运行调试器

设置断点并运行调试器。图片由作者提供

  1. 通过打开 URL http://localhost:3000/test 来验证调试,并且它会重定向到 VS Code,如下所示

调试流程。图片由作者提供

太棒了!使用 Docker Compose,你已经准备好将调试技能提升到下一个级别。通过利用这个强大的工具,你将能够更有效地管理容器并简化开发工作流程。无论你处理复杂的代码还是简单地想要提高调试能力,Docker Compose 都是你武器库中的一个绝佳工具。那么,你还在等什么?现在是时候像专业人士一样进行调试了!

结论

这是你所读过的博客文章的总结

  • 使用第三方包 Delve,可以在 Golang 中进行调试
  • 你可以在 docker 和 docker-compose 上使用 delve 调试应用程序,需要做一些额外的工作
  • 我建议将“普通”Dockerfile 和“调试”Dockerfile 分开,因为有一个自定义配置使 Delve 运行顺畅,并且更改环境变得更容易。

参考

译自:https://levelup.gitconnected.com/debugging-dockerized-go-applications-with-vs-code-26b48e9c806b

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
菜鸟一只
你就是个黄焖鸡,又黄又闷又垃圾。

评论(0)

添加评论