Nginx + HTTP/3 (Quiche)のDockerイメージを生成するためにしたこと
書きたいこと
nginx-http3を作るまでの話。Nginx + HTTP/3でビルドに関すること。
Qiita: 「WebサーバーのHTTP/3対応をNginxのリバースプロキシでするためのDockerイメージが出来ました - Qiita」
以下のQuiche公式のGitHubリポジトリにNginx + HTTP/3するまでの方法が書かれている。
quiche/extras/nginx at a0e69eda9da97ebb03ccda38f4bb58cfea572163 · cloudflare/quiche
だが、上記の公式ドキュメントに書かれていないが必要なことがいくつかあった。ここでは書かれていない必要なことやDockerイメージを作るならではのことについて書きたい。
Dockerのベースイメージ
ベースイメージとしてAlpineを使う選択もあったが、ubuntu:18.04もだいぶコンパクトなサイズになっていてAlpineならではのことでビルド時にハマる可能性を考えubuntu:18.04をベースイメージにした。
Dockerfileを書くために必要だったこと
Rustをcurlでユーザーの入力なしにインストールしたい
Dockerfileの中はユーザーがインタラクティブに"y"を入力する環境ではないため上記の方法でRustをインストールしている。
Nginxのmake時のエラー「Could not find Go」を対処するためには「apt install golang-go」をすれば良い
Nginxはビルド時にGo言語を必要としているためインストールが必要。
Nginxでビルドエラー「./configure: error: the HTTP gzip module requires the zlib library.」の解決法
Nginxはzlibをビルド時に必要とするためインストールが必要。
Nginxのビルドのエラー「error: the HTTP rewrite module requires the PCRE library.」の解決法
PCREというライブラリもNginxビルド時に必要の様子。
その他、aptのbuild-essentialやcmakeもビルドに必要になる。
Rustのアンインストール
これが割と対処に時間がかかった。
rustup self uninstall -yをするとCargoやrustupなども含めRustのアンインストールが出来る。だがこれを&&でコマンドを1つにくっつけて実行すると'error: No such file or directory (os error 2)'というエラーが出る現象にハマった。
不思議なことに、&&でくっつけずにRUN rustup self uninstall -yで実行したりイメージ作成後にDockerコンテナ内に入って手動でrustup self uninstall -yする場合は上記のエラーは発生しない。
最終的にRustインストール時にどのファイルが変更されたり追加されるのかをdocker diffで調べて、$HOME/.cargoと $HOME/.rustupにファイルが大量に追加されることが分かり、rm -rf $HOME/.cargo $HOME/.rustupで削除するようにした。$HOME/.profileにPATHを通す設定が追加されるがそこはそのまま。
&&で繋げたかったのは、Dockerイメージのサイズを小さくするため。RUN ...を分けるとレイヤーも分かれるとサイズ大きくなるはずなので&&したかった。Rustやそのライブラリだけで1GBを超えていた。RustのインストールからライブラリのインストールからRustのアンインストールまでが&&つながるのでイメージサイズがnginx:latestと少ないか同じくらいのサイズに出来た。