Dockerfile で Node.js (npm) 導入済の nginx イメージを作る方法
はじめに
今日は Web サイト開発環境向けに Dockerfile を使って Node.js と npm を導入したイメージを作る方法を、nginx の公式イメージを用いてご紹介します
nginx 以外に httpd:2.4 と php:7.4.13-apache イメージでも同様にインストールできました。
- Docker
- 19.03.1
- Node.js
- 14.15.1
- npm
- 6.14.8
- nginx
- 1.19
1. 下準備
今回のファイル構成です。
/path/to/my-project/
├ docker/
│ ├ myapp-web/
│ │ └ Dockerfile
│ │
│ └ docker-compose.yml
│
└ html/
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 のインストールは公式ヘルプを参考にしました。
- Installation · nodejs/help Wiki · GitHub
- https://github.com/nodejs/help/wiki/Installation
Node.js のパスを通す際には、Docker Compose では export コマンドではなく ENV を使います。
- ENV (Best practices for writing Dockerfiles | Docker Documentation)
- https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#env
apt-get install でのパッケージのインストール ですが、
nginx のイメージでは ca-certificates と curl の2つは導入されているので不要です。
しかし、例えば httpd などの他イメージで導入されていない場合があり、上記コードをコピペで使えるようにと考え、今回はあえて記述しています。
最後の WORKDIR は Node.js のインストールとは関係ないのですが、
docker exec したときに指定ディレクトリに入るようにしています。
指定フォルダは nginx イメージでのデフォルトのパスなので、環境に併せて適宜変更してください。
- WORKDIR (Dockerfile reference | Docker Documentation)
- https://docs.docker.com/engine/reference/builder/#workdir
以上で完了です。
あとは以下のような感じで動作確認をしてみてください。
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
- Docker Compose の -p オプションで VS Code でのコンテナ管理を便利にする / Twin Turbo Computing
- https://tt-computing.com/docker-project-vscode
3. おわりに
npm はローカルで実行するという手もあるのですが、他のコマンドをコンテナ内で実行するケースなどでは、ターミナル切り替えが手間になります。
またチーム開発では Node.js のバージョン違いで処理が止まったり、そのための連絡やツール導入が必要になったりします。
自動化や共通化を行うと作業効率が上がります。一つ一つの効果は小さくとも、トータルでみると効果があるなと思うことが多いです。
Docker コンテナへの Node.js インストール自動化についても、ぜひご検討いただければと思います。