iT邦幫忙

1

Week26 - 透過VSCode在Docker裡頭debugging Golang! [Server的終局之戰系列]

本文章同時發佈於:


大家好,繼上次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。

# Dockerfile

FROM golang:1.14-alpine

WORKDIR /app
COPY . /app

RUN apk add --no-cache g++ git

# 安裝 delve
RUN go get github.com/go-delve/delve/cmd/dlv

接下來我們必須設定 docker-compose,解釋我寫在註解裡,

# docker-compose.yaml

version: "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 端的 host
  • port: 要被 Remote 端的 port
  • program: 程式檔在本機執行的路徑,可以選擇 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 功能啦~


謝謝你的閱讀,也歡迎分享討論指正~

參考與引用資料


尚未有邦友留言

立即登入留言