2025/04/28 19:29 Building Small Go Containers?

やあ、ロボ子。今日はGoプログラムのコンテナ構築とパフォーマンス検証について話すのじゃ。

博士、こんにちは。コンテナの構築方法でそんなに差が出るものなんですね。興味深いです。

そうなのじゃ!この検証リポジトリでは、Nixがビルドを高速化するか試したみたいじゃが、再現性は高いものの、劇的な速度向上は見られなかったようじゃな。

Nixは以前から気になっていましたが、そこまでではないんですね。コンテナサイズを最小化する方法も検証したとありますが、結果はどうだったんですか?

Scratchというベースイメージを使うと、一番小さいコンテナが作れるらしいぞ。すごいじゃろ?

Scratchですか、初めて聞きました。他にはどんなライブラリを使って検証したんですか?

database/sql、clickhouse-go、pyroscope-go、go-redis/v9などを使ったみたいじゃ。Nixのgomod2nixがパフォーマンスを上げるかも試したみたいじゃが、効果はなかったみたいじゃな。

なるほど。Dockerキャッシュが有効だとビルド時間が短縮されるのは当然として、UPXを使うとコンテナサイズが縮小されるんですね。

その通り!それに、`.dockerignore`で`.git`フォルダをコピーしないように設定すると、ビルドが早くなるぞ。知っておくと便利じゃ。

`--mount=type=cache`を使ってGoのパッケージキャッシュとビルドキャッシュを有効活用するのも重要ですね。

さすがロボ子、よく分かってるのじゃ!CI/CD環境では、Athensをプロキシとして使うのも良いらしいぞ。`make deploy_athens`でローカルにデプロイできるみたいじゃ。

AthensはGoモジュールのキャッシュ用プロキシですね。SquidもHTTPプロキシキャッシュのテストに使われているんですね。HTTPS通信のためにHTTP CONNECTプロキシとして機能する、と。

その通り!異なる設定を試すために、Containerfileを生成するコードも使われているみたいじゃ。`generate-containerfiles.go`とGoテンプレートを使うらしいぞ。

`make generate-containerfiles`でContainerfileを生成できるんですね。検証コードも用意されているとは、周到ですね。

じゃろ?プリントループとPrometheusカウンターがちゃんと動くか検証するらしいぞ。`make build-validator`と`make run-validator`で実行できるみたいじゃ。

CGOを無効にすると、`-tags=netgo`が適用されるんですね。UPXでGoバイナリを圧縮できるのも覚えておきます。

そうじゃ!Distrolessコンテナのベースイメージは`gcr.io/distroless/static-debian12`で、Scratchコンテナのベースイメージは`https://hub.docker.com/_/scratch`じゃ。

NixでGoプロジェクトをビルドする際は、`buildGoApplication`か`gomod2nix`を使うんですね。`buildGoModule`を使う際は、GOPROXYがオフになっている点に注意、と。

最後に、Athensはtiniを使っているらしいぞ。…ところでロボ子、コンテナがいっぱいだと、まるでゴミ箱みたいじゃな!

博士、それは少し強引すぎます…。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。