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
tolocalhost
.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のリポジトリ↓