名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。

GinとDockerを軽く動かしてみてローカルでAPIを立ててみる(メモ)

自分が良く書いているPythonでやればちょいちょいでできそうな気がしますが、他の言語やフレームワークもう少し触ってみたい気持ちになったので、ちょっとやってみることにしました。

Ginとは?

Go言語のWebフレームワークで、まあまあ人気があるっぽいです。少し古い記事ですが、使うにあたってこのあたりの比較を見てみることにしました。

qiita.com

上記を見てGo自体もそんなに慣れているわけではないので、日本語ドキュメントがあることと、それなりに採択されているという情報があるGinにすることにしました。

公式ページはこちら。README見た感じでもある程度の機能が実現できそうなので、少し動かしながら試してます。とにかくシンプルで早そうですね。

gin-gonic/gin: Gin is a HTTP web framework written in Go (Golang). It features a Martini-like API with much better performance -- up to 40 times faster. If you need smashing performance, get yourself some Gin.

まだ試せてない機能も多いので、もっと試していきたいですね。

また gin 周りの操作を楽にするための cli もあるようなので、そちらも合わせて使っています(名前が一緒なのすご、こんなの正しく動くのか?!とか思いましたが、出きるっぽい。確かにGoのimport文的に行けそうな気もするしね)

codegangsta/gin: Live reload utility for Go web servers

Dockerで動かす

正直なところ Docker ファイルを自分で書いていくのあまり得意ではないのですが、まあ下みたいなのを書いてみて、やってます。

FROM golang:latest

COPY api /go/src/api/
WORKDIR /go/src/api/

RUN go get github.com/gin-gonic/gin \
    && go get github.com/codegangsta/gin

CMD ["gin", "-p", "37301", "-i", "run"]

docker-compose.yml としては下記。マジで最低限しか書いてない。

version: '3'

services:
  api:
    build:
      context: .
      dockerfile: docker/api/Dockerfile
    ports:
      - 37301:37301
    tty:
      true

今は api 配下にすべてのコードを置くような形にしてます。フォルダの構成は下記。

❯ tree
.
├── README.md
├── api
│   ├── controller
│   │   ├── go.mod
│   │   ├── go.sum
│   │   └── pri.go
│   ├── go.mod
│   ├── go.sum
│   └── main.go
├── docker
│   └── api
│       └── Dockerfile
└── docker-compose.yml

これで docker-compose build して docker-compose up -d してるだけです。最初ディレクトリやパッケージのimportの関係でハマりましたが、その結果理解がはかどった気もします。

pri.go は雑に get 、post に対応する処理だけ書いてあります。

Dockerfileやdocker-compose.yml書くのはあまり知見がなかったので、このあたりを参考にしました。今は DB すら使わない最小構成なので、DB周りの設定は全部はがしてしまいましたが…。

あと wsl で試していると、たまーに変なエラーが出たりします。下記を参考にしました

WSL2上のdocker-composeで認証エラー - roy-n-roy メモ

Go Modules ?

依存関係を正確に表すためのものらしく、ビルド時の再現性を担保するための仕組みらしい。 go.mod ファイルはそれを実現するためのものであるという認識を私はしている。

あとは相対的なインポートは推奨されないらしく、ローカルのリポジトリを正確に参照するために、下記のことを行った。慣れていないこともあるが、どうも import 周りでハマりがちな気がする。

Go Modules でインターネット上のレポジトリにはないローカルパッケージを import する方法 - Qiita

これで正しいのかどうかは少し疑問はあるが、いったん解決しているので次に進むことにする。一応、公式にも用意されている。

Modules · golang/go Wiki

ほかに気にしてることとして

まとめ

一旦長くなってきたので、メモとして残すことは終わりですが、import周りが未だによくわからないですね。うーん…

著名なライブラリとかをもう少し読んでみようかな。