NixOSでnix-buildを使ってdocker containerをビルドしfly.ioで使う
タイトルなげぇよ、とか思ったけど雑にまとめておく
何をしたか
NixOS で nix-build を使って docker container をビルドした
正確には OCI Container だけど docker で動作確認とかしているので docker container とする
そのビルドした docker container を fly.io へデプロイした ここでめちゃめちゃハマった
具体的には一日溶けた
そしてめでたくデプロイは成功した
これつい先程の話
上手くいったリポジトリ
これを見ること
何にはまったか
WorkDirへ存在しないディレクトリを指定していた
その結果、何をしても {cmd}: No such file or directory (os error 2)が出て何も動かなかった!
このディレクトリ問題に気がついた後で色々とガチャガチャやったところ動いたので、これが原因だった
そもそもなんで nix-build でコンテナビルドをしようと思ったのか
docker の container イメージのいい感じのやつに chainguard というブツがある これが使うとコンテナサイズをセキュアに縮めることが出来る
しかし細かいバージョンを使おうとすると 続きは契約後で!!という感じになる
商売が上手い
そしてお金がつらい
あとメインのお客さんはエンプラっぽい
つらい
だったら他の手段でコンテナを縮めたらいいじゃない、という事で目を付けたのが pkgs.dockerTools
Nix の nixpkgs に生えているコンテナを作る君
pkgs.dockerTools.buildImage でコンテナイメージを生やせる
便利
その際に pkgs.pkgsMusl を活用することによってコンテナサイズをキッチリと詰めた
詰めた内容
今回の対象は goatcounter だったので pkgs.pkgsMusl.buildGo123Module で musl as libc を実施
また goatcounter は静的ビルドをして musl への依存を削除
ただし細かい処理で shell などが必要になるため busybox を追加
この再 busybox も静的ビルド
コンテナサイズはどれほど縮まったか
これが今日の午前中にあった話
具体的にはこの revision で見られる
容量の雑な比較
docker images -a | grep kalaclista-analytics の結果は以下
kalaclista-analytics-v1 が chainguard を使った方
code:bash
$ docker images -a | grep kalaclista-analytics
kalaclista-analytics-v1 latest 4650665ef1ca 12 hours ago 34.1MB
kalaclista-analytics-v2 latest 1059f177bb24 54 years ago 29.6MB
コンパクト!!1
ただしセキュリティは若干劣化している
/etc/passwd すら無い(!!)のでプロセス全部は root:root で動いている
侵入されたらやばい
しかしこのコンテナでは所詮アクセスカウンタぐらいしか動いてないので気にしない事とした
と勝手に判断しました
それと入っている Credentials の類いもメールアドレスと重複しないパスワードぐらいなので……