ベストプラクティス
公式のベストプラクティス
最小のイメージをベースにする
最小権限の原則に則って、本番環境のイメージを作成するときに、不要なツールが含まれないイメージをベースにする。
例えば bash が含まれていないイメージをベースにすればその分だけ乗っ取られても安全といえる。
Distoless はアプリケーション実行に最低限のツールを含めたイメージらしい。
- Dockerfile ベストプラクティス - Node.js アプリケーション編 #Docker - Qiita
- Distroless という Docker イメージがよさげ #distroless - Qiita
マルチステージビルド
マルチステージビルドを取り入れると、Docker イメージ実行に不要なファイルを減らすことができ、安全性の向上とイメージサイズの減少を見込める。
Node.js & TypeScript アプリケーションを Docker イメージ化する際、以下のようなものが必要になる。
- TypeScript のソースコード
- TypeScript コンパイラのパッケージ
- その他ビルドするのに必要なパッケージ (もしかしたら bash などのコマンドもあるかもしれない)
しかしプロダクション環境では JavaScript のビルド結果さえあればアプリケーションは実行できるので、これらは要らない。
そこで、Dockerfile をビルドのステージとプロダクションのステージに分ける。
以下はマルチステージビルドを考えた Next.js アプリケーションの Dockerfile である。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | |
rootユーザーで実行しない
Docker デーモンや Docker コンテナを非 root ユーザーで動かせないか検討する。
Docker で Node.js を動かすときのベストプラクティス
詳しくは以下で考える。