😇

コンテナ上に展開するサービスにGoがよく使われる理由の一つ

2020/11/15に公開

Go+Dockerをさわることになったのですが、コンテナ上に展開するサービスにGoがよく使われる理由を垣間見たのでメモ

Goの特徴

  1. コンパイル・ビルドで依存関係を含めたワンバイナリになる
  2. ライブラリのリンクはほぼスタティックリンク(一部ダイナミックリンクがあるみたい)
  3. 実行バイナリがそれなりに軽い(低容量)

何がいいのか

依存関係がほぼワンバイナリに収まっており、コンテナビルド時に依存ライブラリやバイナリをインストールする必要がなくなる

  • コンテナのビルド時間を短くすることができる
  • コンテナの容量を軽くすることができる
  • コンテナに余計なものを入れなくてすむ
  • 依存関係をあまり気にしなくていい

※scratchイメージにhttpsアクセスのためのルート証明書とバイナリだけを入れたコンテナで動くみたい

他の環境だとどうなのか

知ってる範囲ではありますが

  • LL言語(PHP/Ruby/Python)
    • LL言語本体、パッケージ管理ツール、パッケージ、依存ライブラリ等インストールする必要のあるものが多い (1と2が満たせない)
  • C#(.net core)
    • バイナリビルド時のオプションに依存関係をワンバイナリにまとめるオプションはあるが、.net coreのライブラリをすべて包括するのでバイナリサイズがでかい(100MBオーバーで3を満たせない)
    • webで利用する場合、バイナリまとめなくてもデプロイツールでなんとかしちゃうよな

Discussion