しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

App Service on Linux で Ruby アプリケーションを動かそうとして上手くいかなかった話

昨日の時点で気が付いてましたが、中の人から Twitter で発表されてたので App Service on Linux の Ruby 対応を試してみました。結果としては動かすことが出来なかったです。

2,3 時間を検証に使ってしまったので、試した内容をメモしておくことにします。

元々 Docker Image をビルドしてカスタムイメージとして登録すれば、Ruby に限らずどんなイメージでも実行できますが、ランタイムスタックとして Ruby を選択して試しました。

f:id:shiba-yan:20170214220826p:plain

空っぽの状態で Ruby 2.3 を選択すると、よく見るデフォルトサイトが表示されます。

f:id:shiba-yan:20170214221013p:plain

Working Directory として /home/site/wwwroot が表示されていますが、実はこれが嘘でデフォルトアプリケーションは別の場所で動作しています。

実際に wwwroot を確認してみると hostingstart.html しかありません。

f:id:shiba-yan:20170214221203p:plain

非常に罠っぽいのですが、デフォルトアプリケーションは Ruby 2.3 の Docker Image 内に含まれています。なので、wwwroot で動かすための設定は Dockerfile に含まれていない状態です。

とりあえず Linux 上で rails new を実行してテンプレート的なアプリを作成しました。git を初期化して Web App のリポジトリ URL を追加して git push します。

rails new webapp
cd webapp

git init

git config http.postBuffer 52428000

git add .
git commit -m "initial commit"

git remote add origin ...
git push origin master

今の App Service on Linux では git push の時にハングアップしますが、http.postBuffer の設定を入れておけば内部的には成功します。デプロイは非同期で進んでいるので放置します。

f:id:shiba-yan:20170214222953p:plain

Git で Ruby アプリケーションをデプロイすれば、Kudu が自動的にデプロイスクリプトを生成して wwwroot 以下にコピーしてくれますが、デプロイを行っても起動中のコンテナは再起動してくれないので、今は仕方なく Web App 自体を停止してから起動し直します。Web App の再起動では効果なかったです。

立ち上げ直した後にサイトにアクセスすると応答が返ってこなくなります。App Service が書き出している Docker のログを確認すると、nokogiri のインストールで止まっています。

f:id:shiba-yan:20170214224252p:plain

そもそも nokogiri などの gem はデプロイスクリプトで全てインストールされているはずなので、起動時にインストール処理は行ってほしくないのですが、この辺り Ruby 力が足りないのでよくわかりません。

今の Ruby ランタイムスタックで使われている Dockerfile を見ても、App Service 側で何かやっているみたいです。エントリポイント的にコマンドが実行されているようですが、まだよくわかってません。

他にも foreman を使ったカスタム Ruby ランタイムスタックを作成して、Heroku っぽく使えるように試してみましたが、nokogiri のインストールが不安定だったり、実行時に foreman が謎のエラーで落ちたりと完全に心が折れました。中の人からのドキュメントを待つことにします。