Use VScode to remote debug Go lang code in Docker container

3 min read 04-10-2024
Use VScode to remote debug Go lang code in Docker container


Debugging Go Code in Docker Containers with VS Code: A Step-by-Step Guide

Tired of sifting through logs to find pesky bugs in your Go code running inside a Docker container? Remote debugging with VS Code offers a streamlined and efficient solution. This guide will walk you through setting up a powerful debugging environment, empowering you to pinpoint issues with ease.

Scenario: Imagine you have a Go application deployed within a Docker container. While the application runs smoothly, you encounter a mysterious error in a specific function. Navigating through logs can be tedious and time-consuming. Remote debugging allows you to step through your code, inspect variables, and identify the root cause of the problem directly in VS Code.

Original Code:

package main

import "fmt"

func main() {
	name := "World"
	greeting := fmt.Sprintf("Hello, %s!", name)
	fmt.Println(greeting)
}

Setting up the Debugging Environment

  1. Install Docker: If you haven't already, download and install Docker for your operating system.

  2. Create a Dockerfile: Define your Docker image, including the necessary dependencies and your Go application.

    FROM golang:1.20
    
    WORKDIR /app
    
    COPY . .
    
    RUN go mod download
    
    CMD ["go", "run", "main.go"]
    
  3. Build your Docker Image: Run the following command to create the Docker image.

    docker build -t my-go-app .
    
  4. Run your Docker Container:

    docker run -it -p 8080:8080 my-go-app
    
  5. Configure VS Code: Install the Debugger for Chrome and Go extensions from the VS Code marketplace.

  6. Create a launch.json File: Navigate to Run and Debug in VS Code, then create a launch configuration file named launch.json.

    {
      "version": "0.2.0",
      "configurations": [
        {
          "name": "Launch (Docker)",
          "type": "go",
          "request": "launch",
          "mode": "debug",
          "program": "${workspaceFolder}/main.go",
          "env": {
            "GOPATH": "/go" // Adjust based on your Dockerfile
          },
          "preLaunchTask": "docker-compose-build-and-run",
          "remoteRoot": "/app",
          "port": 9000, // Default port for remote debugging
          "remoteDebugServer": "localhost:8080" // Replace with the port exposed in your Docker container
        }
      ]
    }
    

    Explanation:

    • name: Name of the debug configuration.
    • type: Set to "go" for debugging Go applications.
    • request: "launch" to start the debug session.
    • program: Path to your Go application file.
    • env: Define environment variables needed for your application.
    • preLaunchTask: You may need to create a custom task to build and run your Docker container.
    • remoteRoot: The root directory of your application inside the container.
    • port: The port for remote debugging communication.
    • remoteDebugServer: The address of your Docker container.
  7. Start Debugging: In VS Code, click on the "Run and Debug" icon (green play button) and choose "Launch (Docker)" from the list of debug configurations.

Debugging in Action

Now, you can set breakpoints in your Go code, step through the program, inspect variables, and even evaluate expressions. The debugger will automatically pause execution at breakpoints, allowing you to analyze the state of your application at a specific point in time.

Benefits of Remote Debugging:

  • Increased Efficiency: Save time and effort by directly debugging within your development environment.
  • Clearer Understanding: Identify the source of errors and pinpoint specific lines of code responsible for issues.
  • Enhanced Development Workflow: Improve productivity and reduce the debugging cycle.

Advanced Tips:

  • Logging: Utilize logging statements to track code execution and capture relevant data.
  • Conditional Breakpoints: Stop at specific points in the code based on certain conditions.
  • Watch Expressions: Monitor variable values during debugging sessions.
  • Advanced Debugger Features: Explore features like stepping into/out of functions, stepping over statements, and evaluation of expressions for comprehensive debugging.

Conclusion:

Remote debugging with VS Code provides a powerful and user-friendly solution for resolving errors in Go applications running inside Docker containers. With a few configuration steps, you can transform your development workflow and navigate complex bugs with ease. The ability to step through code and analyze variables directly in VS Code significantly enhances your debugging capabilities, saving you valuable time and effort.