🧚‍♂️ブラウザ上でLaravelを実行する環境TinkervelのTips🧚‍♂️

1 min read読了の目安(約1000字)

Tinkervelは、ブラウザ上でLaravelが動くツールです。
ちょっとした検証環境を作るために作りました。laravelplaygroundのネタ被りです。

この記事では、どうやって動いてるか?を紹介します。サービスの概要はこちらで

カンの言い方はもうお気づきかと思いますが、tinkervelはDockerを活用して実装されています。
ただ、Dockerを使うだけでは色々問題があるのでいくつかのTipsで最適化しコストを抑えて実装しています。

Tips

volumeをRead-Onlyで共有する

TinkervelではベースのPHPコンテナにLaravelのコードを共有することでLaravelを実行できるようにしています。PHPコンテナにLaravelを埋めてしまってもいいのですが、細かい調整の度にリビルドし容量を圧迫するのを辞めたかったので、VolumesのROプロパティで読み込み専用で載せています。(逆にRO付けないと変更が全ユーザに共有されてしまうため)

docker runで処理

docker-compose.ymlでもよかったのですがコンテナのゴミが残る、同じディレクトリで実行すると名前がかぶる問題が発生しそうだったので封印してdocker runで動くようにしました。
もちろん、--rmオプションをつけて、すぐコンテナを廃棄します。しかし、これだとステートレスな処理しかできないため、セッション動作ができません。なので、検証用特化のサービスにしました。

コマンド引数でのコードの受け渡し

OSコマンドインジェクション対策は別途行なっているのですが
ざっくりbash -c "第三者コード"みたいな感じでコンテナにコードを渡すことによって
他のユーザにコードが漏れないようになっています。

実行時間制限の実施

php.iniで実行時間制限をかけれるのですが、いくつか上書き方法があったので
さらに外側から実行時間制限をかけています。10sでkillされるはずです。されなかったらバグなので教えてください。

外部アクセスの禁止

networkにnoneを指定して、外に出れないようにしています。
これは踏み台にされることを想定して対策しています。