LoginSignup
1

More than 5 years have passed since last update.

Docker で REPL をできる repla というツールを作っている話

Last updated at Posted at 2017-12-09

さっと動かしたいなぁ、と思った時に、REPL はとても便利。
Javascript なんかだと、jsfiddle がとても便利で、結構使ったりする。
プログラム言語の公式サイトが Web REPL を用意しているケースも多い。

しかし、REPL すら無い言語とか、言語 + フレームワーク まで含めて確認したいと考えると、用意された REPL では満足できないこともある。

改めて、作った動機

直接の動機としては、Github プロジェクト作成の高速化 をすることによって、
『あ、これ作りたいな』と思ったら直ぐ作り出せるようにはなった。

けど、それ以前に 『これって、どう動くんだろう』 をもっと簡単にできないかな、と思った。

あとは、Docker の記事 を書いていて、Docker の環境用意能力の高さは異常だなと思ったので。

Repla

ということで、取り敢えず形にしてみたのがこれ。

Repla

repla.gif

まだまだ調整中だが、アドベントカレンダーの 12/10 が空いてしまったため、少しタイミング早いけど書いた。

試験は

  • Windows 10
  • Docker for Windows
  • Chrome

で行っている。

技術解説

Docker

Repla 自体も Docker で動いている。
Docker on Docker 構成で、Docker の中からホストマシンの Docker を操作している。

DinD には、以下の2種類がある

  • /var/run/docker.sock をコンテナに提供
  • privilege を与える

privilege 与えるのが怖かったので、docker.sock 形式に。
Windows で Unix Socket 使えるの? と思ったけど、 Windows でも docker.sock がマウントできた ので、それを利用した。

やってないけど、privilege でも多分いけるはず。

docker run -d -v "/var/run/docker.sock:/var/run/docker.sock" ...

● Image

docker イメージをベースに、サーバを動作させるための nodejs の環境を追加している。

nodejs 環境の構築は、公式イメージ をお借りした。

Dockerfile
FROM docker:17.11.0

# 以下、nodejs の Dockerfile から引用している
ENV NODE_VERSION 9.2.1

RUN addgroup -g 1000 node \
  && adduser -u 1000 -G node -s /bin/sh -D node \
  && apk add --no-cache \
  libstdc++ \
  && apk add --no-cache --virtual .build-deps \
  binutils-gold \
  curl \
...

Server Side

何にするか悩んだが、 Docker Remote API が簡単に使えそうなものに絞った。

適当に dockerode にしたけど、今考えると Python にしとけば良かったと思っている ( Stream API に慣れてなくて辛すぎる )

来年には Python になってるかも。

● Web フレームワーク

Koajs を使っている。
特に理由は無いが、async /await がそれなりに使えそうだったので。

Client Side

riotjs

レンダリングやイベント管理は riotjs を利用している。
とにかく面倒なことを考えたくなかったので、ブラウザコンパイルしている。

ace

エディタ部分に、高機能エディタである ace を利用する。
こんな高機能なエディタを OSS で公開してて凄い。

bulma

デザインは bulma をベース。

細かい所では、CSS Grid を一部で利用していて、flexbox よりもプロパティが直感的で良いかもなぁと感じた。

REPL って他にないのか

このツールを作るにあたり、ライバル視察として『web repl』 で検索してみたが、メチャクチャあることが分かった。

各言語のWeb REPLサービスまとめ

repl.it という凄いサイトがある。
これでも十分なんだけど、DB を用意できないとか、 Web サーバの動作確認ができないとかあるので、この点は Docker でローカルにクラスタ組めるほうが良いかなと。

これから

  • サード製パッケージのインポート
    • require("moment") から moment を取得して yarn add moment してから実行したい
      • 正規表現得意じゃないんだよなぁ…
  • セキュリティ対策
    • 今は、いくらでも Injection できそうなので怖い
      • 自分で自分が信用できない :smiley:
  • クラスタ構築
    • DB 接続系のライブラリの動作確認
    • Web 系ライブラリの動作確認
    • Docker Compose を Docker Remote API で操作ってできるのか?
      • できるなら、定義に Compose 追加すれば早い
  • ユーザカスタム
    • repls/ 以下にフォルダを追加して定義体とテンプレート置けば拡張できるようにはなっている
    • Github 上で Pull Request 受けながら増やしていくか、ユーザが増やしやすいように volume マウントして独自定義追加できるようにするか

絶対誰か作ってると思うんだけどなぁ。Docker + REPL。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1