このサイトを視聴するにはJavaScriptを有効にしてください。Full-stack)JS/PHP/Go/Docker/Nginxなど。技術または趣味よりの発信ブログです。このブログ自体も自分がnetlify/gatsbyJS/Reactで書いてます。一部の記事はgithubアカウントでコメントできます。Image化するGolangはシングルバイナリ(単体で動く実行ファイル)を出力してくれてありがたいのですが、それをコンテナ向けの軽量LinuxであるalpineやBusyBoxを使って動かそうとすると、ハマることが多い。シングルバイナリじゃなかったのか、と思ってしまうのだが、どうやらデフォルトで一部のライブラリがダイナミックリンクになっているからである。このあたりが参考になった。link)にするこれ、割とググればいろいろ出てくるのですが結局のところイマイチ最適解が見つからない。いうと、中身に入っているライブラリなどで割かしビルド条件を変える必要があるため。コンテナのサイズも小さくしたいので、いろいろとオプションを調べて、自分はこんな感じで落ち着いた。APIアプリケーションです。main.go問題はldflagsという引数で、これはgccが使うldの引数である。makeでのインストールなんかに慣れている人は結構なじみがあるみたいだが、自分はあまり知らなかった。簡単に言えばどのようにリンクするかの設定だ。"-static"で、ビルドしたバイナリをスタティックリンクにする。することで外部ライブラリを使う挙動をしなくなる。-sオプションを追加する。-sオプションはシンボルテーブルとデバッグ情報を省略することで容量を削減する。一つ、-wオプションはDWARFのシンボルテーブルを省略。何ぞやと思ったけどこれもデバック的な情報らしい。netgoは、Golangのnetパッケージを使用している場合必要になります。Webサーバソフトウェアはほぼ必須。必要な理由として、この指定が無いとnetパッケージがダイナミックリンクになってしまうかららしく、実際抜くとAlpineなどでは動かなくなります。tagsを使っていた場合は、複数指定できるみたいです。test"という感じ。これで動く!と思いがちなのだが、これでも動かない事が多い。いくらシングルバイナリと言っても、結局Linux上で動いているしLinuxシステムに依存する設定や必要なパッケージを別途入れる必要があったりする。Linuxを使用している。sizeと書いてあるように5MBしかない。Linuxが好きで結構な頻度で使っている。UbuntuやCentOSと比べると入っているもの自体が何もなさ過ぎて、この環境でビルドなんかをするのはかなり難易度が上がったりする。いうより、bashが入ってなかったりするので普通に使うのも割と簡単ではない。LinuxでのHHVMのコンパイルはマジで無理過ぎてあきらめた。足りないものの最低限としてこの2つのパッケージを入れた。/etc/localtimetzdataはタイムゾーン情報。タイムゾーンはちゃんとAsia/Tokyoにしておかないと後々変なバグを引き起こしそう。GMT+0のイギリスに住んでいる人は問題ないと思いますが。ca-certificatesはCAの認証局情報。HTTPS通信でCA証明書を要求されるので必要。alpineにはlibresslは入っているっぽいのでhttps行けると思いきやこれが無いと駄目になることがある。Webサーバアプリケーションならこれで最低限かな?という感じでした。buildを使い、ビルドしたものをAlpineなどの軽量Linuxで動かすのがベスト。最終的なDockerfileはこんな感じ。APIサーバはこれで10MBで収まった。Alpineで5MB、Goバイナリで5MBという感じ。modules対応させるために少し変更。["/build/app"]こんな感じ。容量削減はLinuxの上のレイヤーを知らないといけないので勉強になる。Alpineを使っているとUbuntuやCentOSの大体揃っていることへのありがたみがひしひしと伝わります。