APIモックツール`json-server`をdockerで扱う

npmにはjson-serverというパッケージがあります。

JSON形式のAPIを返すモックを手軽に用意できるパッケージです。

このjson-serverをdockerで起動できるようにしたので、情報をまとめます。

json-serverとは

JSON形式のAPIを返すモックを手軽に用意できるnpmのパッケージです。

node.jsが導入されていれば、npmコマンドで簡単にインストールしてAPIのモックを構築できます。

# パッケージのインストール
npm install -g json-server

# ローカルインストール(package.jsonの devDependenciesで管理したい場合)
npm install json-server

jsonファイルを用意し、下記のようにjson-serverコマンドを実行することでモックが起動します。

# json-serverの起動例
json-server --watch data.json --port 8082

# json-serverの起動(ローカルインストールした場合)
npx json-server --watch data.json --port 8082

json-serverが起動した状態でURLにアクセスすると(上記の例の場合はlocalhost:8082)、指定のJSON形式でレスポンスを得ることができます。

dockerでjson-serverを起動する

docker-json-server ←こちらのリポジトリにて詳細に説明されていますが、専用のdockerイメージが公開されています。それを使うと下記のようなコマンド一発でjson-serverを起動することができます。

docker run -d -p 80:80 -v $(PWD)/data/json_file.json:/data/db.json clue/json-server

ホスト環境を汚さないので便利です。

docker composeでjson-serverを起動する

専用のdockerイメージから直接起動するのも便利ですが、コマンドが少し長いので、docker-composeで扱えるようにしました。

ディレクトリ構成

json-server/
.
├── .env
├── Dockerfile
├── data/
│   └── data.json
└── docker-compose.yml

.env

JSON_SEVER_PORT という名前で環境変数を設定するためだけに用意したenvファイルです。json-serverのLISTENポートをここで指定します。

Dockerfile

json-serverをインストールし、起動させるだけのシンプルなdockerfileです。.envファイルから JSON_SERVER_PORT を環境変数として取り込みます。

FROM node:14.4.0-alpine3.12

ARG JSON_SERVER_PORT
ENV JSON_SERVER_PORT=$JSON_SERVER_PORT

WORKDIR /data

RUN npm install -g json-server

CMD json-server --watch data.json --port $JSON_SERVER_PORT --host 0.0.0.0

dockerで起動したjson-serverへアクセスする場合、 --host 0.0.0.0 オプションを引数に渡さないとアクセスできないので注意です。

The default host address the server was listening to was changed from of 0.0.0.0 to localhost .

With adding --host 0.0.0.0 to your command the server should behave as usual.

https://github.com/typicode/json-server/issues/811#issuecomment-400329813

alpineのイメージを採用したので、本家のclue/json-serverのイメージと比べてサイズが小さいです。

docker-compose.yml

こちらも、ボリュームのマウントとポートフォワードを指定しただけのシンプルなymlファイルです。

version: "3"

services:
  json-server:
    container_name: json-server-dev
    build:
      context: .
      dockerfile: Dockerfile
      args:
        - JSON_SERVER_PORT=$JSON_SERVER_PORT
    tty: true
    volumes:
      - ./data:/data
    ports:
      - $JSON_SERVER_PORT:$JSON_SERVER_PORT

data.json

ここにレスポンスの内容となるjsonファイルです。

json-serverの起動

docker-compose up -d でjson-serverが起動します。

まとめ

json-serverは手軽にAPIのモックを作成できて非常に便利です。

私はホスト環境を汚したくないのでdocker composeで起動できるようにしてみましたが、ファイル数が増えて少し冗長な気もします。

なのでホスト側で開発する場合はpackage.jsonのdevDependenciesに管理、コンテナベースで開発する場合はdocker or docker-composeで起動するという風に使い分けると良いのかなと感じました。

githubのリポジトリ↓

https://github.com/hodanov/docker-template-json-server