GoのREST API開発環境を作りたく、まずは最小限の環境を作ってみた
似たような記事はたくさんあるが、自分としては記事の数だけヒントを貰うことができたため自分の記事も誰かの役に立つと考え、備忘録も兼ねてここにメモしておく
この記事のゴール
- Dockerコンテナ上でGo(echo)を稼働させる
- Airを使い、ホットリロードを効かせる
- ローカルホストにアクセスするとHello, world!を出力する
ファイル構成
- app_name # root
- .air.toml # Airの設定ファイル、自動出力
- docker-compose.yml
- Dockerfile
- go.mod
- go.sum
- main.go
Go Moduleの作成
Go及びDockerはインストール済みであることを前提に書いています
$ mkdir app_name
$ cd app_name
$ go mod init github.com/username/app_name
echoの導入、実装
まずはechoをインストールする
(余談ですが、importにechoを直接書いてgo mod tidy
するか、下記のようにgo get
でインストールするかどちらが良いんでしょうかね)
$ go get -u github.com/labstack/echo
ルートアクセス時、Hello, worldを画面に出力するコードを実装する
package main
import (
"net/http"
"github.com/labstack/echo"
)
func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, world!")
})
e.Logger.Fatal(e.Start(":8080"))
}
実装後、go run main.go
でechoによるWebサーバを起動
とりあえずこれでルートにアクセスするとHello, worldは出力されるようになった
Airの導入、初期設定
今のままでは、main.goを修正する度に再ビルドが必要となり、開発体験が悪い
そのためソースファイルを修正すると自動でビルドされる仕組み、つまりホットリロードを導入する
Goでホットリロードを実現するためのライブラリとして、代表的なものは下記の通り
※Star数は2022/5/3現在の数値
名称 | Star数 | 備考 |
---|---|---|
Air | 6,647 | |
Fresh | 3,313 | 更新停止? |
realize | 4,225 | 更新停止? |
今回は継続してメンテナンスされておりStar数も多いAirを利用する
以下コマンドでインストール及び初期設定を行う
$ go install github.com/cosmtrek/air@latest
$ which air # ~/go/bin/air
$ air init # .air.toml(設定ファイル)が出力される
設定ファイルは特に編集不要でそのまま使用可能
ただ、個人的にはログに時間出力したいため、下記設定のみ変更した
[log]
time = true
Airによるechoの起動
$ air
下記のように表示されれば成功!
Airを介してechoが起動していることが分かる
試しにmain.goのHello, worldの文を変更し保存すると再ビルドのログが出力され、ブラウザも更新すると文章が変更されているはずです
__ _ ___
/ /\ | | | |_)
/_/--\ |_| |_| \_ , built with Go
mkdir ~/app_name/tmp
watching .
!exclude tmp
building...
running...
____ __
/ __/___/ / ___
/ _// __/ _ \/ _ \
/___/\__/_//_/\___/ v3.3.10-dev
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
O\
Dockerの導入
ここまでは全てローカルで実行している
後はこれらをDocker上で実行するため、Dockerfile
とdocker-compose.yml
を記述する
# Dockerfile
FROM golang:1.18
# ログに出力する時間をJSTにするため、タイムゾーンを設定
ENV TZ /usr/share/zoneinfo/Asia/Tokyo
ENV ROOT=/go/src/app
WORKDIR ${ROOT}
# ModuleモードをON
ENV GO111MODULE=on
COPY . .
EXPOSE 8080
# Airをインストールし、コンテナ起動時に実行する
RUN go install github.com/cosmtrek/air@latest
CMD ["air"]
version: '3'
services:
app:
build: .
volumes:
- ./:/go/src/app
ports:
- "8080:8080"
この設定により、docker-compose up
でコンテナ起動時にAirを介してechoによるWebサーバが起動するようになった
データベース側のコンテナ設定も続けて書いていく必要があるが、本当に最低限の構成をとりあえず組むのが目的なので、今回はここまで
ここまで見ていただき、ありがとうございました。