前に書いた /home のマウントがカスタムイメージの時だけ狂うバグが修正されたようです。ちゃんとコンテナ内の /home がファイルサーバー上の正しいパスにマウントされるようになりました。
バグでカスタムランタイムが作りにくいと書いてましたが、Built-in と同じように作れるようになりました。
早速 Built-in の PHP 7 と同じように扱える nginx + php7 な Runtime Stack を作成しました。ビルドに必要なファイルは全て GitHub で公開しています。
これまでブログに書いてきたように nginx と php-fpm を supervisor で実行する形です。
Docker Hub に shibayan/appsvc-php7-nginx という名前でイメージを公開しているので、App Service on Linux の設定から指定すると使えます。
このイメージで新しく Web App on Linux を作成すると、デフォルトで作成されている hostingstart.html が表示されています。作成したイメージから /home がちゃんと見えていることが分かります。
とりあえず phpinfo を表示してみます。Web App に LocalGit を追加して index.php を追加します。
デプロイ完了後、リロードすると phpinfo が表示されるようになります。Server API が FPM/FastCGI なので、Apache が使われている Built-in のイメージとは異なっていることが分かります。
/home/site/wwwroot にあるコンテンツを共有するので、これまでの Web App と全く同じように Git を使ったデプロイを使いつつ、独自の Runtime Stack を用意して実行することが出来るようになりました。
環境の構築は Docker Image を使うのがかなり楽なので、必要な PHP の extensions などがあればデフォルトのイメージをベースにすると、カスタマイズが簡単に出来ます。
Built-in イメージを使って拡張する
App Service on Linux で使われているイメージは Docker Hub で公開されています。
https://hub.docker.com/u/appsvc/
PHP 7 のイメージに対してカスタマイズしたい場合には、FROM に指定してビルドすれば問題ないです。
FROM appsvc/php-7.0 # 何かする
イメージを作成してしまえば、Docker Hub などに公開すれば App Service で使えるようになります。
Runtime Stack の作り方
完全に真っ新な状態から独自の Runtime Stack を作成する場合、基本的には wwwroot をドキュメントルートとして扱うように Dockerfile を書くだけです。nginx の場合は以下のように書いています。
RUN rm -rf /var/www/html \ && ln -s /home/site/wwwroot /var/www/html EXPOSE 80
nginx の設定で /var/www/html をドキュメントルートにして、実体は共有されている wwwroot のシンボリックリンクとしています。ポートはデフォルトでは 80 になっているので、EXPOSE しておきます。
ログは /home/LogFiles 以下に書き出すようにすれば永続化されます。割とシンプルに実装できます。
Windows の場合は Site Extensions を使って無理やりランタイムをインストールしていましたが、Docker を使う方が筋が良いですね。Windows Server Containers 対応を待ってます。