VSCode+Docker+WSL2でGo開発環境を整える
Go言語開発環境をセットアップしたいのだが、巷にある情報はWindowsホスト上に直接Goをインストールしている記事がほとんどだった。
個人的にはホスト環境はクリーンに保ちたいのと、せっかくWSL2やDockerがあるので、これらを使ってGo開発環境を整えたかったので備忘録として残す。順次更新予定。
前提
- WSL2(Ubuntu)がインストールされていること
- MSの公式インストール手順に従えばできると思う
- UbuntuにDockerがインストールされていること
- 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の最初のスクリプトを作成。
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println("My favorite number is", rand.Intn(10))
}
Dockerfileを用意。マルチステージデプロイにしているが、開発中はbuildステージのみ動かすように後で設定する。
go-outline
とgopls
は、この後に入れる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 /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もそういえばそうだった・・・。
- パッケージや拡張機能の整備ができてない。
- デバッグ環境の整備ができてない。
この辺は追々書きます・・・。
参考情報
Discussion