Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/ko1103/nodejs-docker

Best Practice of Node.js Dockerfile
https://github.com/ko1103/nodejs-docker

docker docker-image dockerfile nodejs typescript

Last synced: about 1 month ago
JSON representation

Best Practice of Node.js Dockerfile

Awesome Lists containing this project

README

        

# Best Practice Node.js Dockerfile

このリポジトリはNode.jsのDockerfileを作る上でのベストプラクティスをまとめたものです。

以下にそれぞれのベストプラクティスについて説明します。

## 1. ベースイメージは偶数バージョンを使う

Node.jsは偶数のバージョンがLTS(Long Term Support)となっています。そのため、ベースイメージには偶数バージョンを使うことをお勧めします。

## 2. ワーキングディレクトリを設定する

ワーキングディレクトリを設定することで、コンテナ内での作業がしやすくなります。また、ディレクトリに権限設定を行うことで、セキュリティを向上させることができます。

## 3. パッケージのインストールを最適化する

パッケージのインストールを最適化することで、ビルド時間を短縮することができます。また、Dockerのレイヤーキャッシュを活用することで、ビルドの再実行を高速化することができます。
Dockerfileには例として、 `package.json`と `package-lock.json`のファイルをコピーし、パッケージのインストールを行ったあとに他のファイルをコピーするように記述することで、上記のファイルが変更された場合のみパッケージのインストールを行うようにしています。

## 4. npmrcファイルはmountして使う

npmrcファイルをDockerfileに直接コピーすることはセキュリティ上のリスクがあるため、npmrcファイルはmountして使うことをお勧めします。
他にもビルド時に必要な環境変数はなるべくDockerレイヤーに含めないことをお勧めします。

## 5. マルチステージビルドを活用する

TypeScriptのプロジェクトならもちろんですが、ビルド時に必要なものはビルド用のコンテナでビルドし、実行時に必要なものだけを含むコンテナは別で作ることで、イメージサイズを小さくすることができます。

## 6. プロダクションステージのベースコンテナは小さいものを使う

ビルド時にはビルド用のツールが必要ですが、実際にプロダクションでサーバを稼働させるためにはそれらのツールは不要です。そのため、ビルド時にはビルド用のツールを含むイメージを使い、実際にプロダクションでサーバを稼働させるためにはそれらのツールを含まないイメージを使うことをお勧めします。Node.jsの場合、 `alpine`, `slim`などの小さいイメージを使うことをお勧めします。

## 7. NODE_ENVを設定する

Node.jsのツールによってはNODE_ENVを設定することでプロダクションモードで動作するようになるものがあります。そのため、NODE_ENVを設定することをお勧めします。

## 8. Userを設定する

Dockerコンテナはデフォルトでrootユーザーで実行されますが、セキュリティ上のリスクがあるため、Userを設定することをお勧めします。

## 9. プロダクションで利用しないpackageは削除する

プロダクションで利用しないpackageは削除することで、イメージサイズを小さくすることができます。削除方法は `npm prune --production`または `npm ci --only=production`で対応できます。

## 10. ポートをエクスポートする

コンテナ外部からアクセスできるポートを明示的に設定することで、セキュリティを向上させることができます。

## 11. Nodeコマンドで起動する

起動時にnpmコマンドを利用すると、npmのscriptで子プロセスとしてサーバを立ち上げることになるので、Dockerコンテナを終了するときなどにシグナルが正しく伝わらないことがあります。そのため、Nodeコマンドでサーバを立ち上げることをお勧めします。どうしても難しい場合は `tini`などのツールを使うことをおすすめします。