🔧

VSCode+Docker+WSL2でGo開発環境を整える

2022/11/03に公開

Go言語開発環境をセットアップしたいのだが、巷にある情報はWindowsホスト上に直接Goをインストールしている記事がほとんどだった。
個人的にはホスト環境はクリーンに保ちたいのと、せっかくWSL2やDockerがあるので、これらを使ってGo開発環境を整えたかったので備忘録として残す。順次更新予定。

前提

  • WSL2(Ubuntu)がインストールされていること
  • UbuntuにDockerがインストールされていること
  • VSCode がインストールされている
  • Windows Terminal
    • 必須じゃないけどWSLを操作する際にあると便利です

VSCodeの拡張機能をインストール

  • Dev Containers
    • VSCodeがコンテナに接続するための拡張機能
  • WSL
    • VSCodeからWSLに接続するための拡張機能
  • Remote Developement
    • Remote - SSH, Dev Containers, WSLの拡張機能の三つがパックになった拡張機能

個別に入れてもいいし、Remote Developmentを入れるでもいいです。
どの拡張機能もMS本家なので安心できますね。

VSCodeからWSL2にアクセスする

WSL2環境から作業ディレクトリを作成してVSCodeを立ち上げる。

~ ❯❯❯ mkdir learn-go
~ ❯❯❯ cd learn-go
~/learn-go ❯❯❯ code .

VSCodeが立ち上がり、左下のメッセージが「WSL: ~」になっていればVSCodeからWSL2にアクセスできています。

開発環境のコンテナを立ち上げる

Docker HubのGoイメージを見ると、他の言語ではあるようなslimのバージョンがありません。
公式的には、golang:<version>がデフォルトで特に目的がないならお勧めしているらしいが、どうやら軽量化するならマルチステージデプロイのほうがいいらしい。
試しにgolang:1.19.3でビルドしてみると994MBに対し、golang:1.19.3-buster -> alpine:3.16でデプロイすると7.63MBだった。
ただし、マルチステージデプロイの場合、VSCodeがアクセスするコンテナは最後に使われたイメージのコンテナになるため、この場合alpineイメージなのでgoコマンドが使えず、開発しずらい・・・。

他の記事を見ても、本番環境と開発環境用途で分けているようなので、開発時はマルチステージは使わないでコンテナを作ってく。

A Tour of Goの最初のスクリプトを作成。

main.go
package main

import (
    "fmt"
    "math/rand"
)

func main() {
    fmt.Println("My favorite number is", rand.Intn(10))
}

Dockerfileを用意。マルチステージデプロイにしているが、開発中はbuildステージのみ動かすように後で設定する。
go-outlinegoplsは、この後に入れるVSCodeのGo拡張機能で必要になるので入れている。

FROM golang:1.19.3-buster as build
WORKDIR /go/src/app
ADD . /go/src/app
ENV GO111MODULE=on

RUN apt update \
    && go get -u github.com/ramya-rao-a/go-outline \
    && go install golang.org/x/tools/gopls@latest

RUN go build -o /go/bin/app main.go


FROM alpine:3.16 as prod
COPY --from=build /go/bin/app /

CMD ["/app"]

左下の「WSL: ~」をクリックして、Reopen in Containerを選択

初回は、どのDockerfileからイメージを作るか聞かれるので、ここでは From Dockerfile を選択。
Dev Container: Existing Dockerfile となっていれば、VSCodeを通してコンテナの中に入っている。

コンテナ内のVSCode環境を整備する

一度VSCodeからコンテナに入ると、.devcontainer/devcontainer.jsonファイルが生成される。このファイルは、コンテナの設定やコンテナ内のVSCode設定(例えば拡張機能など)が含まれている。
とりあえずVScode公式のGo拡張を入れてみる。

devcontainer.jsonに以下の内容を追記。

"extensions": ["golang.go"]

今の状態だと、prodまで走ってしまうため、ステージ対象を指定する。

// "context": "..", //コメントアウト
// "dockerFile": "../Dockerfile", //コメントアウト

"build": {
	"context": "..",
	"dockerfile": "../Dockerfile", //docker `f`ile が小文字になっているので注意
	"target": "build"
},

Rebuild Container することで、VSCodeに拡張機能が入る・・・と思う。

課題

  • Reopen Containerするときが遅い。Windowsの共有フォルダを使用すると激遅になるらしい。WSLもそういえばそうだった・・・。
  • パッケージや拡張機能の整備ができてない。
  • デバッグ環境の整備ができてない。
    この辺は追々書きます・・・。

参考情報

https://zenn.dev/kcabo/articles/c4f9b7fecc503a
https://zenn.dev/komisan19/articles/45b00df6bfe7ad

Discussion