Go[Echo]をDockerで!
概要
前回フレームワーク無しで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