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
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
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/