Distroless Container Imageとは
Dockerのイメージのことで
リンク先のReadmeをそのまま訳すと…
アプリケーションとそのランタイム依存関係のみが含まれます。これらには、標準の Linux ディストリビューションに含まれるパッケージ マネージャー、シェル、その他のプログラムは含まれていません。
となります、以前ご紹介したAlpineイメージよりもさらに軽量で
シェルも搭載されていないため、セキュアであるといった利点もあるようです。
そんな高度なイメージを使いこなせるのでしょうか…
Node.jsのサンプルを動かす
幸い、下記URLに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
総評としては、セキュアかつコンパクトではありますが
シェルもないということで、トラブル対応が難しいのではないかというかという感想を持ちました。
コメント