あめも

初心者インフラエンジニアの仕事や日常の事をそれとなく書いていくブログです

PostgreSQL Dockerイメージにtextsearch_jaを入れつつmulti stage buildでイメージサイズを小さくする

PostgreSQLの公式Dockerイメージで、textsearch_jaの入ったコンテナイメージを作成した時の話です。

背景

今までCentOSのコンテナを立てて、そこにAnsibleを流してPostgreSQL DBを構築する方法をとっていたところを、Dockerfileでなんとかならないかな、と思ったのがきっかけです。

試した環境

PostgreSQLのDockerイメージは、debianベースのpostgres:9.4を利用
https://hub.docker.com/_/postgres/

Dockerfile

最終的に以下Dockerfileになりました。
01_extension.sql はコンテナ立ち上げ時にcreate extensionする為に必要なので、同じディレクトリに置きます。

Docker multi stage build

Dockerのmulti stage buildを使って、イメージサイズがどのくらい小さくなるか試しました。
multi stage buildは、以下のような段階に分けてイメージが作成されます。

  1. 必要なライブラリが入ったDockerイメージでビルド
  2. ビルドして作成された必要なファイルのみ、新しいDockerイメージにコピー
  3. ビルド後の不要なライブラリが存在しないイメージが完成するので、結果、サイズが縮小できる

もっと細かく調べると、不要なライブラリが存在しない = セキュリティ的にも安全みたいです。
サイズが小さいとKubernetesとかクラスタのコンテナスケールにも役立ちそうなイメージ

multi stage buildについては以下の記事を参考しました。
qiita.com
qiita.com

今回は、PostgreSQLの拡張であるtextsearch_jaをビルドした後、必要なファイルだけ取り出せればイメージサイズが減らせるのでは無いかと期待しました。

multi stage build 実施前

multi stage buildを試す前のイメージサイズはこんな感じで、530MBとベースイメージのpostgresと比較して2倍以上になっていました。

REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
pubpos                     latest              72663df17402        4 minutes ago       530MB
postgres                   9.4                 f047e24dc675        4 days ago          233MB

multi stage build 実施後

408MBになりました。
ちなみにdocker_develdb01という名前のイメージは、AnsibleでPostgreSQLコンテナを構築してた際のイメージです。813MBもありました…

REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
pubpos                   latest              4770a69c142d        46 minutes ago      408 MB
postgres                 9.4                 f047e24dc675        4 days ago          233 MB
docker_develdb01         latest              1f8ed3dccab2        3 months ago        813 MB
centos/systemd           latest              5477808193ce        4 months ago        199 MB

サイズ比較

イメージ multi stage build 無し multi stage build 有り
PostgreSQLベースイメージ 233MB - -
今回作成したイメージ 530MB 408MB 122MB

textsearch_ja テスト

postgresql-test=# SELECT ja_wakachi('東京特許許可局許可局長');
         ja_wakachi
-----------------------------
 東京 特許 許可 局 許可 局長
(1 行)

最後に

小さいは正義