🐋
koを使ってCloud Run環境にデプロイする①
目指すもの
下記の記事のようにgcloud run
を使って、koでビルドしたGoのアプリを簡単にフルマネージドサービスにデプロイできる状態。
今回の記事はコンテナ立ち上げ確認までとなります。
前提
Cloud Run
フルマネージドのサーバーレスプラットフォームです。細かい違いはあれ、AWSだとApp Runnerが似ているイメージです。
フルマネージドの通り、Googleが持つカバー範囲(責任共有モデル)が広いといえます。
AWSですが下記が図解でわかりやすいです。
ko
Goのソースコードからイメージをよしなにビルドしてくれるやつ。
コンテナで立つのにDockerfile不要で、最小単位でいうとルート配下にmain.go
とgo.mod
だけ用意しておけばいい。
ハンズオン
構成
❯ tree .
.
├── go.mod
└── main.go
go.modは、go mod init <任意のモジュール名>
で作成
main.goは下記。Hello, Worldを返すサーバーを立てる。
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":5000", nil)
}
koを使う
$ brew install ko
$ cd <main.goが置いてあるpj>
# 記事によっては、`ko publish .`ですが、renameしたようです。機能は同じです。
# ローカル確認したいときは`--local`を入れましょう。入れないとコンテナレジストリにpushしようとします。
$ ko build . --local
$ docker run -p 5000:5000 $(ko build .)
$ curl http://localhost:5000
Hello, World
ちなみにビルドされたアプリはDistrolessイメージが使われてます。
Alpineが5MiB程度のところ、Distrolessは2MiBと本当に最低限のイメージであり、シェルすらもありません。なので、docker execでshやbashで入ろうとしても入れないです。
バイナリの中に依存関係を持ってくれているGoだからこそ、親和性が高いイメージと言えそうです。
より詳しく知りたいなら下記の記事など
余談ですが、Cloud Native Buildpacksで使われるpaketobuildpacks/builder:tiny
はtinyの通りdistrolessを使います。他のサイズではUbuntuベースです。
次回はデプロイまでレポートしようと思います。ありがとうございました。
Discussion