LoginSignup
9
8

More than 3 years have passed since last update.

DockerでGoのRestAPIを作ってみた(ホットリロード対応)

Last updated at Posted at 2019-11-29

dockerでGolangのAPIを作りたいと思いましてやってみました。
ちなみに、dockerはホットリロードさせたかったので、docker-composeを使っています。

環境

それぞれのバージョンはこちら。
Dockerについての説明とかは省きます。

$ docker-compose --version
docker-compose version 1.24.1, build 4667896b

$ go version
go version go1.13.4 darwin/amd64

■ echo 4.1.11 (ルーティングが便利になるかな、と)
  公式はこちら https://echo.labstack.com/guide
  以下によると、RestAPIに最適化されているらしー。
   https://rightcode.co.jp/blog/become-engineer/go-flamework

■ oxequa/realize
  ホットリロードを行うために入れてみた。

ファイルの準備

適当なフォルダに以下の3ファイルを用意します。

Docker

Dockerfile

# 公式 golang ランタイムをイメージとして使用
FROM golang:1.13

# ソース入れる用のディレクトリ作成(名前はなんでもいいけど、この後の「app」は全部合わせる)
RUN mkdir /app 

# ソース入ってるのここだよ
WORKDIR /app

# ホスト側のカレントにあるファイルをソースフォルダにコピーするよ
COPY . /app

# echo と oxequa/realize のライブラリ取ってくるよ(ぼちぼち時間かかるよ...)
RUN go get -u github.com/labstack/echo/...
RUN go get github.com/oxequa/realize

docker-compose.yml

docker-compose.yml
version: '3'

services:
  api:
    build: .

    #buildが指定されている場合は作成イメージの名前になる
    #build指定なし:このイメージを元に作成される(ex.mysqlとか)
    image: sample_api:0.1

    # ポートフォワーディング(ホスト側:docker側)
    # ホスト側のブラウザで実行するときは http://localhost:1000 で見れるようになる
    ports:
      - "1000:1323"

    # (ホスト側:docker側)dockerの「/app」フォルダとホストのカレントを繋げるよ。
    # ホストの変更が反映されるようになる
    volumes:
      - .:/app

    # デフォルトのコマンドをこれに変える。ホットリロードを有効にする?
    command: realize start --run --no-config

    tty: true

Golang

server.go

server.go
package main

import (
    "net/http"

    "github.com/labstack/echo"
)

func main() {
    e := echo.New()
    routing(e) 
    e.Logger.Fatal(e.Start(":1323"))
}

/* ルーティングを行う */
func routing(e *echo.Echo) {
    e.GET("/", hello)
    e.GET("/:name", greeting)
}

/* http:/~/ の時 */
func hello(c echo.Context) error {
    return c.JSON(http.StatusOK, map[string]string{"message": "hello"})
}

/* http:/~/(名前) の時 */
func greeting(c echo.Context) error {
    /* c.Param("name") とすることで、URLの:name と対応させて取得 */
    return c.JSON(http.StatusOK, map[string]string{"message": "hello " + c.Param("name")})
}

Docker起動

上記ファイルを保管したフォルダに移動して、コマンド実行
(「-d」オプションつけてバックグラウンド実行しない理由は後述。つけても大丈夫)

 $ docker-compose up

これで、ローカルのブラウザからhttp://localhost:1000ってしたら
{message:hello}が。

http://localhost:1000/taroってしたら
{message:hello taro}って帰ってくるはず。

詰まった時の小ネタ

docker-compose up でやってみる
 どういうことかというと、「-d」を取ることでエラーの内容を教えてくれる。

 あずきはコマンド実行後、ターミナルをそのまま使いたかったので、おまじないのように「-d」をつけてました。
 で、エラーで動かないんだけど(docker ps にあがってこない)なんでか分かんなかった。

 原因は同じフォルダ内に「func main()~」が書かれたファイルがいたってことだった。
 試行錯誤しながら作ってたので、バックグランド実行だと気づかなくて何時間も無駄にした。

 でも、苦労したことは忘れない。きっと。

参考

https://qiita.com/y-ohgi/items/671de11f094f72a058b1
https://www.fox-hound.tech/1179/
https://qiita.com/prgseek/items/e557a371d7bd1f57b9b1
https://qiita.com/TsutomuNakamura/items/7e90e5efb36601c5bc8a
http://docs.docker.jp/engine/articles/dockerfile_best-practice.html
https://qiita.com/zembutsu/items/9e9d80e05e36e882caaa
API関連
https://ken-aio.github.io/post/2019/01/30/golang-echo/

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8