ソースを参照

added dockerized node service with mongodb

Brandon Wong 7 年 前
コミット
d64e4e75b3
共有9 個のファイルを変更した204 個の追加0 個の削除を含む
  1. 9 0
      dnodemongo/.babelrc
  2. 5 0
      dnodemongo/.dockerignore
  3. 6 0
      dnodemongo/.gitignore
  4. 11 0
      dnodemongo/Dockerfile
  5. 32 0
      dnodemongo/docker-compose.yml
  6. 16 0
      dnodemongo/initialize.sh
  7. 22 0
      dnodemongo/package.json
  8. 39 0
      dnodemongo/src/service.js
  9. 64 0
      dnodemongo/test/service.js

+ 9 - 0
dnodemongo/.babelrc

@@ -0,0 +1,9 @@
+{
+  "presets": ["env"],
+  "plugins": ["transform-runtime", "transform-object-rest-spread"],
+  "env": {
+    "production": {
+      "plugins": ["transform-remove-console"]
+    }
+  }
+}

+ 5 - 0
dnodemongo/.dockerignore

@@ -0,0 +1,5 @@
+# Put files and paths here that shouldn't get into Docker
+npm-debug.log*
+
+# list of files that shouldn't be copied into the container
+node_modules

+ 6 - 0
dnodemongo/.gitignore

@@ -0,0 +1,6 @@
+.idea
+node_modules
+build
+test-build
+npm-debug*
+*.swp

+ 11 - 0
dnodemongo/Dockerfile

@@ -0,0 +1,11 @@
+
+FROM node:8.8.1-alpine
+
+ADD ./ /opt/app
+WORKDIR /opt/app
+
+USER root
+
+
+
+

+ 32 - 0
dnodemongo/docker-compose.yml

@@ -0,0 +1,32 @@
+version: "3"
+
+services:
+    node-project:
+        container_name: $foldername-dev
+        user: root
+        build:
+            context: .
+        volumes:
+            - ./:/opt/app
+            - /opt/app/node_modules
+        expose:
+            - 9494
+        ports:
+            - 9494:9494
+        command: sh -c "echo \"greetings, friend\" && ./initialize.sh && npm run serverwatch"
+        links:
+            - database
+    database:
+        image: mongo:3.4.10
+        container_name: $foldername-db
+        restart: always
+        # port used for external access, not normally necessary
+        ports:
+            - 27017:27017
+        volumes:
+            - node_project_database_volume:/data/db
+
+volumes:
+    node_project_database_volume:
+
+

+ 16 - 0
dnodemongo/initialize.sh

@@ -0,0 +1,16 @@
+#!/bin/sh
+
+npm install --save cross-env express mongodb
+
+npm install --save-dev \
+    babel-cli \
+    babel-plugin-transform-object-rest-spread \
+    babel-plugin-transform-remove-console \
+    babel-plugin-transform-runtime \
+    babel-preset-env \
+    nodemon \
+    tape \
+    tape-promise
+
+npm run compile
+

+ 22 - 0
dnodemongo/package.json

@@ -0,0 +1,22 @@
+{
+  "name": "@catallaxy/$foldername",
+  "author": "Brandon Wong <wong.brandon@rcgt.com> (https://www.catallaxy.com/)",
+  "main": "build/service.js",
+  "version": "0.1.0",
+  "scripts": {
+    "test": "node test-build/service.js",
+    "compile-prod": "cross-env NODE_ENV=production npm run compile",
+    "compile": "npm run compile-src && npm run compile-test",
+    "compile-test": "babel test --out-dir test-build",
+    "compile-src": "babel src --out-dir build",
+    "watch": "nodemon --watch src --watch test --exec \"npm run compile --silent\"",
+    "serverwatch": "nodemon --watch src --watch test --exec \"npm run compile --silent && node build/service.js\"",
+    "testwatch": "nodemon --watch src --watch test --exec \"npm run compile --silent && npm test\""
+  },
+  "directories": {
+    "test": "test"
+  },
+  "private": true,
+  "dependencies": { },
+  "devDependencies": { }
+}

+ 39 - 0
dnodemongo/src/service.js

@@ -0,0 +1,39 @@
+
+import express from 'express';
+import http from 'http';
+import MongoClient from 'mongodb';
+
+
+
+(async function () {
+    try {
+        const connstring = 'mongodb://database/testproject',
+            db = await MongoClient.connect(connstring);
+        console.log('db', db);
+        await db.close();
+        console.log('closed');
+    }
+    catch(e) {
+        console.error('error', e, e.stack);
+    }
+}());
+
+
+
+const port = process.env.port ? parseInt(process.env.port) : 9494,
+    app = express(),
+    httpserver = http.createServer(app);
+
+httpserver.listen(port, function listening() {
+    console.log('$foldername service now listening on port', port);
+});
+
+app.get('/', function serve(req, res) {
+    res.send('$foldername dockerized service');
+});
+
+
+
+
+
+

+ 64 - 0
dnodemongo/test/service.js

@@ -0,0 +1,64 @@
+
+import {fork} from 'child_process';
+import tape from 'tape';
+import _test from 'tape-promise';
+import http from 'http';
+
+const tapetest = _test(tape);
+
+tapetest('service', async function testService(t) {
+    const server = fork('build/service.js'),
+        connstring = 'http://localhost:8080';
+
+    try {
+        await waitPro();
+        const data = await requestPro(connstring + '/');
+        console.log('data', data);
+    }
+    catch(e) {
+        console.log('error somewhere', e);
+        t.fail('error somewhere');
+    }
+
+    server.kill();
+    t.end();
+});
+
+
+function waitPro(n = 1000) {
+    return new Promise(function pro(resolve, reject) {
+        setTimeout(resolve, n);
+    });
+}
+function requestPro(reqopts, data) {
+    return new Promise(function prot(resolve, reject) {
+        try {
+            let req = http.request(reqopts, function received(resp) {
+                let str = '';
+                resp.on('data', function p(part) {
+                    str += part;
+                });
+                resp.on('end', function done() {
+                    if( resp.statusCode >= 400 && resp.statusCode <= 599 ) {
+                        reject(str);
+                    }
+                    else {
+                        resolve(str);
+                    }
+                });
+            });
+            if( data ) {
+                req.write(data);
+            }
+            req.end();
+        }
+        catch(e) {
+            reject(e);
+        }
+    });
+}
+
+
+
+
+