Golang + Gin + Docker hot reload, VS Code debugging environment construction

Overview

Building a development environment for the Go language framework Gin. (Hot reload, VS Code debugging support)

This code is published on GitHub. https://github.com/yolo-lin/go-demo

environment

Package to introduce

Gin: Go framework cosmtrek / air: Hot reload delve: Debugging

Advance preparation

--Install Go: Install from Official --Turn on the environment variable GO111MODULE to manage dependencies in Go Modules

.zshrc


export GO111MODULE=on

--Initialization of Go Modules

/src


$go mod init package name

Directory structure

The directory structure of Gin is not fixed, so the following is my own style. Place all the main source code under src. In the future, we plan to add models and controllers to src.

.
├── .vscode
│   └── launch.json
├── docker
│   ├── go
│   │   └── Dockerfile
│   └── mysql
│       └── Dockerfile
├── src
│   ├── go.mod
│   ├── go.sum
│   ├── .air.toml
│   └── main.go
│
└── docker-compose.yml

Docker Go

/docker/go/Dockerfile


FROM golang:1.15.2

ENV GO111MODULE=on

COPY src/ /go/src/app/

WORKDIR /go/src/app

# cosmtrek/installation of air
RUN go get -u github.com/cosmtrek/air
#installation of delve
RUN go get -u github.com/go-delve/delve/cmd/dlv

#Start air
CMD air -c .air.toml

MySQL

/docker/go/Dockerfile


FROM mysql:8.0

RUN chown -R mysql /var/lib/mysql && \
    chgrp -R mysql /var/lib/mysql

docker-compose

yml:./docker-compose.yml


version: '3'

networks:
    backend:
      driver: bridge

services:
    go:
        container_name: go
        build:
            context: .
            dockerfile: ./docker/go/Dockerfile
        ports:
            - 8080:8080
            - 2345:2345
        links:
            - mysql
        tty: true
        volumes:
            - ./src:/go/src/app
        depends_on:
            - mysql
        security_opt:
            - seccomp:unconfined
        cap_add:
            - SYS_PTRACE
        networks:
            - backend

    mysql:
        container_name: mysql
        build:
            context: .
            dockerfile: ./docker/mysql/Dockerfile
        environment:
            MYSQL_USER: root
            MYSQL_ROOT_PASSWORD: password
            MYSQL_DATABASE: demo
        hostname: mysql
        ports:
            - "3306:3306"
        volumes:
            - ./docker/mysql/data:/var/lib/mysql
        security_opt:
            - seccomp:unconfined
        networks:
            - backend

    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        environment:
            - PMA_ARBITRARY=1
            - PMA_HOST=mysql
            - PMA_USER=root
            - PMA_PASSWORD=password
        ports:
            - "8081:80"
        depends_on:
            - mysql
        networks:
            - backend

cosmtrek / air settings

Divert the official air_example.toml

Added the description for debugging below

toml:/src/.air.toml


# Debug
#full_bin = "APP_ENV=dev APP_USER=air /go/bin/dlv exec ./tmp/main --headless=true --listen=:2345 --api-version=2 --accept-multiclient"

toml:/src/.air.toml


# Config file for [Air](https://github.com/cosmtrek/air) in TOML format

# Working directory
# . or absolute path, please note that the directories following must be under root.
root = "."
tmp_dir = "tmp"

[build]
# Just plain old shell command. You could use `make` as well.
cmd = "go build -o ./tmp/main ."
# Binary file yields from `cmd`.
bin = "tmp/main"

# Customize binary.
full_bin = "APP_ENV=dev APP_USER=air ./tmp/main"

# Debug
#full_bin = "APP_ENV=dev APP_USER=air /go/bin/dlv exec ./tmp/main --headless=true --listen=:2345 --api-version=2 --accept-multiclient"

# Watch these filename extensions.
include_ext = ["go", "tpl", "tmpl", "html"]
# Ignore these filename extensions or directories.
exclude_dir = ["assets", "tmp", "vendor", "frontend/node_modules"]
# Watch these directories if you specified.
include_dir = []
# Exclude files.
exclude_file = []
# This log file places in your tmp_dir.
log = "air.log"
# It's not necessary to trigger build each time file changes if it's too frequent.
delay = 1000 # ms
# Stop running old binary when build errors occur.
stop_on_error = true
# Send Interrupt signal before killing process (windows does not support this feature)
send_interrupt = false
# Delay after sending Interrupt signal
kill_delay = 500 # ms

[log]
# Show log time
time = false

[color]
# Customize each part's color. If no color found, use the raw app log.
main = "magenta"
watcher = "cyan"
build = "yellow"
runner = "green"

[misc]
# Delete tmp directory on exit
clean_on_exit = true

Now, when docker-compose up -d is done, the config file will be automatically adapted and hot reloaded.

debug

vscode Install the extension of Go and add the debug configuration file below.

json:/.vscode/launch.json


{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Remote",
            "type": "go",
            "request": "launch",
            "mode": "remote",
            "program": "${workspaceFolder}",
            "port": 2345,
            "host": "127.0.0.1",
            "showLog": true,
        }
    ]
}

If you need to debug, change the cosmtrek / air settings. After exchanging full_bin for development and debugging and restarting docker-compose, you can debug with vscode.

toml:/src/.air.toml


# Customize binary.
# full_bin = "APP_ENV=dev APP_USER=air ./tmp/main"

# Debug
full_bin = "APP_ENV=dev APP_USER=air /go/bin/dlv exec ./tmp/main --headless=true --listen=:2345 --api-version=2 --accept-multiclient"

However, if you update the code, it will be automatically built from cosmtrek / air, but the vscode side will be disconnected and you will need to manually reconnect. CleanShot 2020-09-27 at 16.22.58.png

Recommended Posts

Golang + Gin + Docker hot reload, VS Code debugging environment construction
Golang environment construction
VS Code + Azure Functions + Python environment construction procedure
Python local development environment construction template [Flask / Django / Jupyter with Docker + VS Code]
Easy Python data analysis environment construction with Windows10 Pro x VS Code x Docker
Environment construction: GCP + Docker
Golang environment construction [goenv]
Create a VS Code + Docker development environment on a Linux VM
Docker + Django + React environment construction
Create a simple Python development environment with VS Code and Docker
[Linux] Docker environment construction on Redhat
Data science environment construction with Docker
[docker] python3.5 + numpy + matplotlib environment construction
Cross-compiling Raspberry Pi and building a remote debugging development environment with VS Code