[ko]Web Server RTA(Homebrew, Docker, Go)
早くて軽くて安心できる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の機能を参考にして様々なコンテナイメージを試してみてください。
BuildpacksやDistrolessを調べていく過程で以下のブログにたどり着きkoを知りました。
今回紹介したソースコードはPublic DomainなThe UnlicenseなのでCopyしたりCloneしたりDownloadしたりして使ってください。
今回はここまでです。
お読みいただきありがとうございました。
Discussion