📦

[ko]Web Server RTA(Homebrew, Docker, Go)

2021/11/24に公開

早くて軽くて安心できるWebサーバー建てるRTAはぁじまぁるよー!

さっそくスタートです!

まずはHomebrew、Docker、Goを入れておく必要があります。今回はGitpodを使用してタイム短縮を狙います。

次にmain.goとgo.modを用意しておきます。標準パッケージのみを使用して簡潔に書きサイズを小さくすることでビルド時間のタイム短縮を狙います。

package main

import (
	"log"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Hello, World!"))
	})
	log.Fatal(http.ListenAndServe(":8080", nil))
}
module main

go 1.17

koは入力し易さを考慮してHomebrewでインストールします。

$ brew install ko

他にもcurlで引っ張ってきたりGoでビルドする方法もありますがHomebrewを使えば15文字で済みます。

最後にdocker runコマンドにko publish -Lコマンドを乗っけてビルドと起動を同時に行います。

$ docker run -p 8080:8080 $(ko publish -L .)

-Lオプションを使うことでローカルにコンテナイメージが出来上がるので様々な設定が不要になりタイム短縮に繋がります。

$ curl https://8080-<color>-<animal>-<id>.<region>.gitpod.io/
Hello, World!

ここでタイマーストップ。記録は約3分でした。

まずは完走した感想(激うまギャグ)ですが、

gitpod /workspace/gitpod-go $ docker images
REPOSITORY                                       TAG      IMAGE ID       CREATED        SIZE
ko.local/main-fad58de7366495db4650cfefac2fcd61   ...      f59dd2e395a6   51 years ago   8.41MB
ko.local/main-fad58de7366495db4650cfefac2fcd61   latest   f59dd2e395a6   51 years ago   8.41MB

8.41MBとめちゃくちゃ軽いです。

これはgcr.io/distroless/static:nonrootという仮想サイズが0 BのコンテナにGoのバイナリ、タイムゾーン データ、CA 証明書のみ乗っけているからなんですね。

コンテナ内で使用できるコマンドはmainコマンドだけなのでGoのコードに脆弱性がなければ100%安全です。

ただ今回使用したDockerやkoにガバが発生するかもしれないので99%安全といったほうがいいでしょう。

そして何より事前に環境を用意しておけばコマンド1~2つだけで簡単に起動できるので誰でも簡単にWebサーバーを作れてしまいます。

もちろん設定やコードを変更すればファイルサーバーやウェブアプリにすることもできるのでとても便利ではないのでしょうか。

ぜひkoのドキュメントやGoの機能を参考にして様々なコンテナイメージを試してみてください。

https://github.com/google/ko

BuildpacksやDistrolessを調べていく過程で以下のブログにたどり着きkoを知りました。

https://cloud.google.com/blog/ja/products/containers-kubernetes/ship-your-go-applications-faster-cloud-run-ko

今回紹介したソースコードはPublic DomainなThe UnlicenseなのでCopyしたりCloneしたりDownloadしたりして使ってください。

https://gitlab.com/acefed/gitpod-go/-/tree/ko

今回はここまでです。
お読みいただきありがとうございました。

Discussion