🦔

Go[Echo]をDockerで!

2021/09/21に公開

概要

前回フレームワーク無しでwebサーバーを建てました。
今回は、Goのフレームワークであるechoを使ってwebサーバーを立てます。
また、Docker-composeを導入します。

説明

ディレクトリ構造

.
├── Dockerfile
├── app
│   └── main.go
└── docker-compose.yml

Dockerfile

FROM golang:latest

WORKDIR /app
COPY ./app /app

RUN go mod init main \
  && go mod tidy \
  && go build

ENV CGO_ENABLED=0 \
  GOOS=linux \
  GOARCH=amd64
EXPOSE 8080


CMD ["go", "run", "main.go"]

前回でなかった要素

FROM golang:latest
「latest」は最新バージョンを指定します。特に理由はないのでお好きなイメージをお使いください。
対応イメージ確認はこちら - docker.hub_golang


ENV
コンテナに永続的な環境変数を定義します。コピーする対象 コンテナ内のコピー先で指定できます


CGO_ENABLED=0
Goはコンパイル時に、CGOを使ってC言語のライブラリを使うように設定する事ができます。
しかし、scratchイメージにはこのライブラリは用意されていません。
よって、今回はC言語のライブラリを使って欲しく無いので、CGO_ENABLEDを0にしてこの機能をOFFにしました。


GOOS=linux
Goはクロスコンパイルを採用していて、実行環境を指定できます。
今回はscratchイメージで動かすので、linuxを宣言しました。


GOARCH=amd64
amdの64Bitを宣言しました。

main.go

package main

import (
	"net/http"

	"github.com/labstack/echo/v4"
	"github.com/labstack/echo/v4/middleware"
)

var e = createMux()

func main() {
	e.GET("/", articleIndex)

	e.Logger.Fatal(e.Start(":8080"))
}

func createMux() *echo.Echo {
	e := echo.New()

	e.Use(middleware.Recover())
	e.Use(middleware.Logger())
	e.Use(middleware.Gzip())

	return e
}

func articleIndex(c echo.Context) error {
	return c.String(http.StatusOK, "Hello, World!")
}

Echoフレームワーク

"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"

は外部パッケージなのでimportします。この時点でechoは存在しないのでエラーになります。

docker-compose.yml

version: "3"
services:
  api:
    build: .
    ports:
      - "8080:8080"
    working_dir: /app
    tty: true
docker-compose build
docker-compose up -d

docker-compose psコマンドでコンテナが実行出来ているか確認します。

enquate_appw % docker-compose ps
   
       Name             Command       State                    Ports                  
---------------------------------------------------------------------------------
enquate_appw_api_1  go run main.go  Up  0.0.0.0:8080->8080/tcp,:::8080->8080/tcp

docker-compose logsコマンドでログも確認してみましょう。

enquate_appw % docker-compose logs

Attaching to enquate_appw_api_1
api_1  | 
api_1  |    ____    __
api_1  |   / __/___/ /  ___
api_1  |  / _// __/ _ \/ _ \
api_1  | /___/\__/_//_/\___/ v4.5.0
api_1  | High performance, minimalist Go web framework
api_1  | https://echo.labstack.com
api_1  | ____________________________________O/_______

「echo」が実行出来ている事が確認できます。


ブラウザからlocalhost:8080にアクセスします。
無事、 Hello, World! が表示されました。

補遺

元々、Dockerfile内のechoパッケージのインポートはRUN go get -u github.com/labstack/echo/v4にするつもりでしたが、エラーになったのでgo mod tidyで自動でやって貰いました。
DockerとGoで簡単にapiサーバーを立ててみる - Qiitaこの記事のように、ginでは出来たのですが...
エラーの原因は調査中です。

参考

DockerとGoで簡単にapiサーバーを立ててみる - Qiita
Docker コンテナ上に Go の Echo サーバーを構築してみた
Golang on DockerでEchoを動かす - Qiita

Discussion