猫でもわかるWebプログラミングと副業

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

【Go 言語】 Docker 上 で Gin を動かすまで

f:id:yoshiki_utakata:20210324115308p:plain

前回の復習

前回は、 Docker 上で Go を動かすまでやりました。まだ読んでないひとは読んでください。

www.utakata.work

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 が立ち上がるのに結構時間がかかるので、ちょっと長めに待ってください。