こんにちは。現役エンジニアの”はやぶさ”@Cpp_Learningです。
WSL2 + Docker + VS Code の Remote – Containers のGo開発環境が最高だったので、構築方法と実践チュートリアルを紹介します。
Contents
はじめに
以下の記事の前半で各ツールのインストール方法は紹介済みなので、本記事では割愛します。
この記事の後半でPython用のDockerfileの書き方から機械学習アプリ開発までを紹介しました。
本記事ではGo用のDockerfileの書き方からWebアプリ開発までを紹介します。
実践 Dockerチュートリアル -Goプログラミングのサンドボックス作成-
アプリ開発をするとき、気軽に使い捨てできる開発環境(サンドボックス)がほしいケースがよくあります。そんな使い捨て環境をつくるなら Docker が最高です。
Windowsの適当な場所に下記構成のプロジェクトフォルダ:docker-go を作成します。
1 2 3 4 5 6 |
workspace └─docker-go │──Dockerfile └──main.go |
EchoでつくるWebアプリ main.go
Go用のWebフレームワーク:Echoを活用したWebアプリ(main.go)を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package main import ( "net/http" "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" ) func main() { e := echo.New() e.Use(middleware.Logger()) e.Use(middleware.Recover()) e.GET("/", func(c echo.Context) error { return c.HTML(http.StatusOK, "Hello, Docker!") }) // e.GET("/", func(c echo.Context) error { // return c.String(http.StatusOK, "Hello, World!") // }) e.Logger.Fatal(e.Start(":8080")) } |
ブラウザ上に「Hello Docker!」と表示するだけのシンプルなソースコードです。
Dockerfile
Go公式イメージに依存関係管理のための go.mod を入れた Dockerfile を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 |
FROM golang:1.16 WORKDIR /go/src/app # COPY *.go ./ COPY main.go ./ RUN go mod init example.com/myapp RUN go mod tidy EXPOSE 8080 |
簡単に解説すると、以下のコマンドで go.mod の雛形を作成。
go mod init example.com/myapp
以下のコマンドで main.go に書かれた import “hoge” を参照して、必要なモジュールを過不足なくインストールし、かつ 自動的に go.mod と go.sum を更新しています。
go mod tidy
この時点で生成される go.mod は以下の通りです。
1 2 3 4 5 6 |
module example.com/myapp go 1.16 require github.com/labstack/echo/v4 v4.4.0 |
なお今回はWebアプリなので、ポート番号:8080を設定しています。
DockerイメージのビルドとWebアプリ起動
こちらの記事を参考に VS Code の Remote – Containers からイメージのビルドを行います。
ビルドに成功し、かつコンテナに接続できたら、ターミナルを開いて、以下のコマンドで $WORKDIR に移動します。
cd /go/src/app
以下のコマンドでアプリを起動後、適当なブラウザから http://localhost:8080 にアクセスすれば、「Hello Docker!」と表示されます。
go run main.go
DockerとVSCodeでWebアプリ開発 -main.goの編集-
main.go は $WORKDIR だけでなく、Windows上に作ったプロジェクトフォルダ:docker-go の中にも存在します。各階層の構成は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
root │──bin │──(略) │──go │ └──src │ └──app │ │──go.mod │ │──go.sum │ └──main.go │ └──workspace └─docker-go │──Dockerfile └──main.go |
docker-go は DockerコンテナとWindowsとのシェアフォルダになっているので、このフォルダ内でアプリ開発をするのが楽です。
つまり、docker-goの内部ならWindowsのGUIやVSCodeからソースコード編集やファイル作成などができるので、開発が捗ります。
以下のコマンドでディレクトリ移動と go.mod と go.sum のコピーをします。
cd /workspace/docker-go/
cp $GOPATH/src/app/go.sum ./
cp $GOPATH/src/app/go.mod ./
なお $GOROOT は以下のコマンドで確認できます。
go env GOROOT
最終的なプロジェクトフォルダの構成は以下の通りです。
1 2 3 4 5 6 7 8 9 |
workspace └─docker-go │──.devcontainer │──Dockerfile │──go.mod │──go.sum └──main.go |
あとは main.go を好きに編集し、先ほど同様、以下のコマンドで実行・動作確認などを繰り返しながら、開発を進めればOKです。
go run main.go
Windows用の実行ファイルをつくる
Goの魅力の1つは各環境に応じた実行ファイル(シングルバイナリ)を簡単に生成できる点です。
例えば、Windows用の実行ファイル(myapp.exe)を生成するには、以下のコマンドでビルドするだけです。
GOOS=windows GOARCH=amd64 go build -o myapp.exe main.go
Windows上から myapp.exe をダブルクリックすれば、先ほど作成したWebアプリが起動します。
Go開発環境の配布
実行ファイルを配布したいときは、先ほど作成した myapp.exe を配布するだけですが、開発環境を配布したいときや、コンテナごとデプロイしたいケースがあります。そんなときも Dockerを使うのがオススメです。
Dockerfile 編集
今まで扱ってきたプロジェクトフォルダ:docker-go を中身ごとコピーして、myapp-go などにリネーム後、Dockerfile を以下のように編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
FROM golang:1.16 WORKDIR /go/src/app # COPY *.go ./ COPY main.go ./ COPY go.mod ./ COPY go.sum ./ RUN go mod download RUN go build -o myapp EXPOSE 8080 CMD [ "myapp" ] |
あとは myapp-go を中身ごと配布するだけです。
まとめ
WSL2 + Docker + VS Code の Remote – Containers のGo開発環境が最高だったので、構築方法と実践チュートリアルを紹介しました。
Docker入門やWebアプリ開発入門の勉強にもなると思うので、参考になれば嬉しいです。
また、何らかの理由で Docker を使えない/使いたくない人は Scoop + VS Codeを使ったGo言語の環境構築手順を説明した記事もあるので、参考にしてください。
Goの開発環境も整ったし、今後もGoの記事を書きたいと思います。
以下 Go言語の本紹介。最初の一冊は「みんなのGo言語」がオススメです。