Dockerfile で Node.js (npm) 導入済の nginx イメージを作る方法

はじめに

今日は Web サイト開発環境向けに Dockerfile を使って Node.js と npm を導入したイメージを作る方法を、nginx の公式イメージを用いてご紹介します

nginx 以外に httpd:2.4php:7.4.13-apache イメージでも同様にインストールできました。

Docker
19.03.1
Node.js
14.15.1
npm
6.14.8
nginx
1.19
目次
  1. 下準備
  2. Dockerfile に Node.js インストールを追加
  3. おわりに

1. 下準備

今回のファイル構成です。

/path/to/my-project/
  ├ docker/
  │  ├ myapp-web/
  │  │  └ Dockerfile
  │  │
  │  └ docker-compose.yml
  │
  └ html/

docker-compose.yml は下記のようにしています。

/docker/docker-compose.yml
version: "3"

services:
  myapp-web:
    container_name: myapp-web
    # ./myapp-web/Dockerfile でイメージをビルド
    build:
      context: ./myapp-web
      dockerfile: Dockerfile
    # 80 番ポートを割り当て
    ports:
      - 80:80
    # ローカル の ./html フォルダを
    # コンテナの /usr/share/nginx/html にマウント
    volumes:
      - ../html:/usr/share/nginx/html

2. Dockerfile に Node.js インストールを追加

Node.js インストールは Dockerfile に下記のように記述することで実現できます。
(説明用にコメントを多めに入れています)

# Docker 公式 nginx イメージを使用
FROM nginx:1.19

# Node.js 設定
ARG node_ver=14.15.1
ARG node_path=/usr/local/lib/nodejs
ARG node_file_name=node-v${node_ver}-linux-x64

# Node.js のパスを通す
# (/usr/local/lib/nodejs/node-v14.15.1-linux-x64/)
ENV PATH ${node_path}/${node_file_name}/bin:$PATH

RUN apt-get update \
  # 必要なパッケージをインストール
  && apt-get install -y ca-certificates curl xz-utils \
  # Node.js をダウンロード
  && curl https://nodejs.org/dist/v${node_ver}/${node_file_name}.tar.xz > ${node_file_name}.tar.xz \
  # Node.js の各ファイルを /usr/local/lib/nodejs/node-v14.15.1-linux-x64/ に解凍
  && mkdir -p $node_path \
  && tar xJvf ${node_file_name}.tar.xz -C $node_path

# カレントディレクトリ設定
WORKDIR /usr/share/nginx/html

Node.js のインストールは公式ヘルプを参考にしました。

Node.js のパスを通す際には、Docker Compose では export コマンドではなく ENV を使います。

apt-get install でのパッケージのインストール ですが、
nginx のイメージでは ca-certificates と curl の2つは導入されているので不要です。

しかし、例えば httpd などの他イメージで導入されていない場合があり、上記コードをコピペで使えるようにと考え、今回はあえて記述しています。

最後の WORKDIR は Node.js のインストールとは関係ないのですが、
docker exec したときに指定ディレクトリに入るようにしています。

指定フォルダは nginx イメージでのデフォルトのパスなので、環境に併せて適宜変更してください。

以上で完了です。
あとは以下のような感じで動作確認をしてみてください。

myapp_myapp-web:latest イメージが既にある場合は事前に削除してください。
(docker images コマンドなどで確認できます)

$ cd /path/to/my-project/docker
$ docker-compose -p myapp up -d
$ docker exec -it myapp-web bash

root@123456789abc:/usr/share/nginx/html# node -v
v14.15.1
root@123456789abc:/usr/share/nginx/html# npm -v
6.14.8

3. おわりに

npm はローカルで実行するという手もあるのですが、他のコマンドをコンテナ内で実行するケースなどでは、ターミナル切り替えが手間になります。

またチーム開発では Node.js のバージョン違いで処理が止まったり、そのための連絡やツール導入が必要になったりします。

自動化や共通化を行うと作業効率が上がります。一つ一つの効果は小さくとも、トータルでみると効果があるなと思うことが多いです。

Docker コンテナへの Node.js インストール自動化についても、ぜひご検討いただければと思います。