8
Help us understand the problem. What are the problem?

posted at

Go + echo + Air + Dockerで最小限かつホットリロードなAPI開発環境を作る

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を画面に出力するコードを実装する

main.go
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は出力されるようになった
image.png

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上で実行するため、Dockerfiledocker-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"]
docker-compose.yml
version: '3'
services:
  app:
    build: .
    volumes:
      - ./:/go/src/app
    ports:
      - "8080:8080"

この設定により、docker-compose upでコンテナ起動時にAirを介してechoによるWebサーバが起動するようになった
データベース側のコンテナ設定も続けて書いていく必要があるが、本当に最低限の構成をとりあえず組むのが目的なので、今回はここまで
ここまで見ていただき、ありがとうございました。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
8
Help us understand the problem. What are the problem?