前回の復習
前回は、 Docker 上で Go を動かすまでやりました。まだ読んでないひとは読んでください。
go.mod とは
go.mod は、 PHP の composer.json や JavaScript の package.json のような、 ライブラリを管理するファイルです。
リポジトリルートに go.mod ファイルを作成します。
Docker コンテナ内で go mod init <モジュール名>
します。
通常、モジュール名は、GitHubのリポジトリのURLにします。
go mod init github.com/yoshikyoto/sample
みたいな感じにします。
すると、go.mod
ファイルができます。
最初は Go のバージョンだけが記載されています。
module github.com/yoshikyoto/sample go 1.16
go mod を使って gin をインストール
go get コマンドを使います。
$ go get -u github.com/gin-gonic/gin
すると、 go.mod にライブラリの依存関係が追加されます。
module sidejob go 1.16 require ( github.com/gin-gonic/gin v1.6.3 // indirect github.com/go-playground/validator/v10 v10.4.1 // indirect github.com/golang/protobuf v1.5.1 // indirect github.com/json-iterator/go v1.1.10 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.1 // indirect github.com/ugorji/go v1.2.4 // indirect golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 // indirect golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect )
Dockerfile の修正
このままだと、docker-compose down すると、インストールされていた gin が消えてしまいます。
そこで、 Dockerfile で gin がインストールされるようにします。
Go のディレクトリ構成スタンダートを参考にして
https://github.com/golang-standards/project-layout/blob/master/README_ja.md
build
ディレクトリの下に Dockerfile
を作成します。
FROM golang:1.16 COPY go.mod /code/go.mod COPY go.sum /code/go.sum WORKDIR /code RUN ls RUN go mod download COPY . /code CMD go run main.go
そして docker-compose.yml で
version: "3" services: app: container_name: "app" volumes: - ./:/code tty: true command: /bin/bash build: context: . dockerfile: build/Dockerfile
これで、 docker-compose up -d --build
とすれば、 Docker をビルドしつつ立ち上げてくれます。
gin を起動するコードを書く
main.go を変更します。
package main import "github.com/gin-gonic/gin" import "net/http" func main() { engine:= gin.Default() engine.GET("/", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "hello world", }) }) engine.Run(":3000") }
docker-compose.yml に書いてある command の部分を消して、
Dockerfile に書いてある go run main.go
が実行されるようにします。
また、ポート 3000 にアクセスできるようにします。
version: "3" services: app: container_name: "app" volumes: - ./:/code tty: true build: context: . dockerfile: build/Dockerfile ports: - 3000:3000
これで、 docker-compose up -d
してから localhost:3000 にアクセスすると
HTTP レスポンスが返ってきます。
docker-compose up してから gin が立ち上がるのに結構時間がかかるので、ちょっと長めに待ってください。