Distroless Container Imageを使う

IT

Distroless Container Imageとは

GitHub - GoogleContainerTools/distroless: 🥑 Language focused docker images, minus the operating system.
🥑 Language focused docker images, minus the operating system. - GitHub - GoogleContainerTools/distroless: 🥑 Language foc...

Dockerのイメージのことで
リンク先のReadmeをそのまま訳すと…
アプリケーションとそのランタイム依存関係のみが含まれます。これらには、標準の Linux ディストリビューションに含まれるパッケージ マネージャー、シェル、その他のプログラムは含まれていません。

となります、以前ご紹介したAlpineイメージよりもさらに軽量で
シェルも搭載されていないため、セキュアであるといった利点もあるようです。
そんな高度なイメージを使いこなせるのでしょうか…

Node.jsのサンプルを動かす

幸い、下記URLにexpressを使ったサンプルがあったので
こちらを使ってイメージをビルドします。

https://github.com/GoogleContainerTools/distroless/tree/main/examples/nodejs/node-express

まずは以下のURLからzipでコードを保存し、任意の場所へ解凍します。
https://github.com/GoogleContainerTools/distroless/tree/main

次にexpressのサンプルディレクトリへ移動し、イメージを作成します。

cd /mnt/<上記を配置したフォルダ>/distoroless-main/examples/nodejs/node-express
# イメージ名を変更する時はnodeの部分を好きな名前にする
docker build -t node .

あとは作成したイメージを以下のように起動します。

docker run --rm --detach -p 3000:3000 node

簡素ではありますが、アクセスすると出力が確認できます。

Dockerfileを覗いてみる

Dockerfileの中身を見てみます。

FROM node:20 AS build-env
COPY . /app
WORKDIR /app

RUN npm ci --omit=dev

FROM gcr.io/distroless/nodejs20-debian11
COPY --from=build-env /app /app
WORKDIR /app
CMD ["hello.js"]

まず目につくのはFROMにより、ベースイメージが2回定義されている点です。
これは、マルチステージビルドといわれるもので、簡単に言うと一つ目のFROM「build-env」でNode.jsのモジュールをインストールし
その結果を二つ目のFROMで書かれたイメージへコピーしています。
これにより最終的に二つ目のイメージのみが作成され、Node.jsの実行に必要なモジュールのみを同梱されたイメージを作成することが可能になっています。

最終的なイメージのサイズは200Mを切ります。
素晴らしいですね。

docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
node         latest    2c41b66fb477   21 hours ago   173MB

総評としては、セキュアかつコンパクトではありますが
シェルもないということで、トラブル対応が難しいのではないかというかという感想を持ちました。

コメント

タイトルとURLをコピーしました