巨人の足元でたじlog

そうして言葉を軽んじるから――― 君は私の言葉を聞き逃す

goのginをdocker-composeでローカル環境で動かす

以下のような構成で作成しました。

 

.
├── backend
│   ├── Dockerfile
│   ├── go.mod
│   ├── go.sum
│   └── main.go
└── docker-compose.yml

main.go作成後、以下を実行します。

$ go mod init example.com/go-project
$ go mod tidy

 

ファイルの内容はこの通り

Dockerfile

FROM golang:1.19

WORKDIR /app

COPY go.mod ./
COPY go.sum ./
RUN go mod download

COPY *.go ./

RUN go build -o /main

CMD [ "/main" ]

main.go

package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func ping(c *gin.Context) {
    c.IndentedJSON(http.StatusOK, gin.H{"message": "pong"})
}

func main() {
    router := gin.Default()
    router.GET("/ping", ping)

    router.Run(":8080")
}

docker-compose.yml

version: '3'
services:
  api:
    platform: linux/x86_64
    build: ./backend
    ports:
      - "8080:8080"

 

 

ハマったところとしては、ginのチュートリアル

router.Run("localhost:8080")

としてサーバーを動かしていたのでそのままやっていたら、コンテナ内で

curl localhost:8080/ping

をやっている分にはレスポンスが返ってきていたのですが、ホストからアクセスしようとすると、そもそもの疎通ができていない状態になってしまっていました。

他の記事等を見ているとlocalhostなしでRun(:8080)としているコードが多かったのでやってみたらこれでいけました。

うーんしかし根本の原因はちょっとよくわからなかったです。

コンテナ力がちょっと足りていないなあ。精進します。

 

あと微妙にハマったのは、ローカルmacでgo mod tidyでgo.sumを生成していたのですが、ローカルで使っていたgoのバージョンとDockerfileで使っていたgoのイメージのバージョンが違っていたがために、go.sumが整合性取れなくなっていて動かなかった問題もありました。

本当はalpine使ったほうが良かったのかもしれないですが、動いているので大目に見てもらいます。

ともあれ、これで動きました!

ここから開発にブーストかけていきたいと思います!