この記事は KMC アドベントカレンダー 19 日目の記事です。
背景
世界にはたくさんの不便・だるい・面倒があり、われわれ人類は様々な道具を作り使うことで不便・だるい・面倒を粉砕してソシャゲ周回する時間を捻出したり異常な旅程の旅行に出ています。
手元のVPSでいくつかのbotやらを動かしているんですが、雑にdist-upgradeしたら依存関係が壊れ起動失敗してたのでコンテナに詰める*1ことにしました。
コンテナに詰めたもの
最近書いてるGoやらRustはコンパイルするとあんまり外部に依存しないシングルバイナリ吐かれるのであんまりコンテナ詰め詰めの必要を感じないんですが、PythonやらPerlやらNode.jsで書いたやつ*2は詰め詰めすることでの幸せ度が比較的高そうです。
コンテナ詰め詰め
とりあえずDockerfile書くわけですが、PythonやらNode.jsにPerlで書いたやつを詰めるのでそれぞれ調べる必要がある。
Perl編
最後にPerl。最後になったのは緊急地震電文ビューアが古のCGIなので、それをどうやってコンテナに詰めようかな~となっていたら一番最後に。この実装10年以上前に書いたものなので懐かしさがいっぱい。
インタネットを眺めても「Perlをコンテナに乗せる2022」みたいな記事は見つからなかったので好きにやった。好きにやってるのでAlpineLinuxに依存ライブラリもcpanmでなくapkで入れています。とりあえず動いてるのでヨシなんですが、ライブラリのバージョンを指定する術がない。
ちなみにCGIの方はfastcgi化してlighttpd*3でホストしてみました。Perlのfastcgi moduleはunicodeを書くとwarningを吐く*4アレな感じなのでmonkey patchで黙らせてる。
おまけ:Go
どこまで小さく出来るか試してみたところ、scratchに/etc/passwd
、/etc/group
、/etc/ssl/certs/ca-certificates.crt
、/usr/share/zoneinfo/Asia/Tokyo
を放り込んだら動いた。
イメージサイズがGoのバイナリとほぼ同じぐらいまで小さくなってすごかった。
番外:コンテナをどこに浮かべるか
コンテナを何処で走らせるかはマネージドk8sから素朴にdockerするまで様々な選択肢があります。
今回は軽量k8sであるところのk0sを使ってさくらVPSにシングルノードで立てました。
使用メモリは300MBytes程度(実測)なので、さくらの2G VPSで今のところ大丈夫そう。
もともとWebサービスをhostするnginxが立っているので、サブドメを切ってリクエストを中継しています*5。過渡期の構成とは言え、static fileをserveするだけで3つのnginx instanceがリクエストをバケツリレーするのでこうなんかちょっとしたいところ。
k0s構築の話を書くと完全に間に合わないので、またそのうち書きます。一年後のアドベントカレンダー記事で書きました。