docker

Dockerでmockyを使ったスタブサーバを立ち上げる

More than 1 year has passed since last update.

背景

APIを使ったシステムを作るのに接続先APIがまだない場合に、簡単にAPIのスタブサーバを立ち上げたい。
mockyという便利なものを使わせていただく。

mockyとは

Node.jsベースでできたモックサーバ。

okv/mocky : https://github.com/okv/mocky

環境

Mac
Docker
docker-compose

説明しないこと

Dockerやdocker-composeのインストールや操作方法
Node.js の使い方

やりたいこと

特定のURLにアクセスされたら、特定のjsonデータを出力させる。
jsonデータは、ファイルで用意してそれを読み込んで出力させる。
リクエストデータもjson形式で、POSTで受ける。

手順

構成

current
 |
 +- docker-compose.yml
 |
 +- mocky
 |    |
 |    +- Dockerfile
 |
 +- stub
 |    |
 |    +- mocky.js
 |    +- user-100.json
 |    +- user-101.json
 |    +- user-102.json
 |    +- user-list.json

mockyのコンテナimageを定義する

Dockerfile

ROM node:latest

RUN npm install mocky

今回はこれを docker-composeから実行して作るが、これだけ動かしてもOK

mockyを扱いやすいように docker-composeで起動方法を定義する

docker-compose.yml
version: '2.2'

services:
  mocksan:
    build: ./mocky
    container_name: mocksan
    volumes:
      - "./stub:/node"
    ports:
      - "3000:3000"
    entrypoint: node /node/mocky.js


モックしたいURLを定義する

mocky.js
var mocky = require('mocky');
var fs = require('fs');

mocky.createServer([
{
    // ユーザ情報
    url: '/api/v01/user/get',
    method: 'post',
    res: function(req, res, callback) {
        var params = JSON.parse(req.body); // 受け取ったjsonデータを参照する場合
        var f = '/node/user-' + params.userid + '.json';  // パラメタ別のjsonファイル
        fs.readFile(f, 'utf8', function(err, text) {
            callback(null, {
                status: 200,
                body: text
            });
        });
    }
},
  {
    // ユーザリスト
    url: '/api/v01/user/list',
    method: 'post',
    res: function(req, res, callback) {
      fs.readFile('/node/user-list.json', 'utf8', function(err, text) {
        callback(null, {
          status: 200,
          body: text
        });
      });
    }
  }

]).listen(3000);

起動

$ docker-compose up -d

テスト

ホストマシンからは、localhost でアクセスできる。
別のDockerコンテナ内からの場合は、mocksan でアクセスできる。

curlコマンドで動かしてみる。

$ curl -X POST http://localhost:3000/api/v01/user/get -d '{"userid":"100"}'

{
    "userid": "100",
    "username": "hanako-san"
}

ログ

docker のログ出力機能でmockyへのアクセスを見ることができる。
console.log などで出力した場合もここに出る。

$ docker logs mocksan -f

[mocksrv] [req 0] [Thu, 07 Dec 2017 06:21:30 GMT] method: POST url: /api/v01/user/list req.body: {"userid":"100"}
[mocksrv] [req 1] [Thu, 07 Dec 2017 06:21:40 GMT] method: POST url: /api/v01/user/list req.body: {"userid":"101"}
[mocksrv] [req 2] [Thu, 07 Dec 2017 06:24:49 GMT] method: POST url: /api/v01/user/list req.body: {"userid":"102"}
[mocksrv] [req 3] [Thu, 07 Dec 2017 06:24:49 GMT] method: POST url: /api/v01/user/list req.body: {"userid":"103"}

注意

mocky.js を変更した場合は、nodeまたは、コンテナの再起動が必要。

感想

とても便利。