概要
Laravel12で、学習がてらメンバー限定の掲示板appを個人開発しました。
非課金でデプロイしたいため、Herokuに代わる選択肢としてRender.comを採用。
DockerfileでFrankenphpを使用した際に、Render.comのログに「frankenphp: operation not permitted」が出た件について、デバッグの記録です。
実行環境
- Laravel12
- PHP 8.2.8
- Docker(Dockerfile)
- FrankenPHP(PHPアプリサーバー)
- Render.com(PaaS:アプリケーションのホスティング・実行環境)
- Neon(サーバーレスPostgreSQL:DB)
問題点
Render.comでDockerfileを使ってデプロイ。しかし、Render.comのログに「frankenphp: operation not permitted」(権限エラー)が出てビルド処理が止まる。
デバッグ結論
FrankenPHPは "rootに近い特別な権限※" を利用している。
(※AIティーチャーの解説によると、
専門的には 「Capabilities(ケーパビリティ)」と呼ばれる仕組み。
FrankenPHP のバイナリに root 権限相当のケーパビリティが付いている。
とのこと)
Render.comはクラウド環境のため、セキュリティ上の理由から権限に制限がある。
そのためFrankenPHPをRender上で動かすには、Dockerfile内の記述を非rootユーザー(一般ユーザー)にして対応する必要が出てくる。
AIティーチャーのサポートにより、
- まずDockerfile内で実行用ユーザーを作る
- FrankenPHPが使う設定フォルダの所有者を変更
- 実行用ユーザーに切り替える
という作業を記述して対応しました。
デバッグの細道(解決に至るまでの流れ)
まずFrankenPHPのマニュアルのどの部分がエラーに関係するのか、AIティーチャーに確認。
どうやら「Dockerイメージ」→「#非rootユーザーとして実行する」の部分???
FrankenPHPマニュアル 「カスタムDockerイメージのビルド」
マニュアルの該当部分を読んだ後に、AIティーチャーに解説・説明してもらう。
その上でその内容を、現状のDockerfileに適用させたいとAIティチャーに相談。
以下のDockerfileにしてGitHubリポジトリにプッシュしたところ、無事Render.comでデプロイできました。
※デプロイはできたものの、次の問題(エラー)が‥。それはまた別の記事にて。
# 注:今回のエラー・デバッグに関する部分のみ抜粋
# --- 非rootユーザー設定の追加 ---
# 実行用ユーザー(appuser)を作成
ARG USER=appuser
RUN useradd -m ${USER}
# 【重要】マニュアルに従い、特権ポート用のケーパビリティを削除
# これにより、root以外のユーザーでもエラーなく起動できるようになる
RUN setcap -r /usr/local/bin/frankenphp
# 環境変数の設定
ENV APP_ENV=production
ENV APP_DEBUG=false
ENV APP_LOG=errorlog
# FrankenPHPがリッスンするポート。Renderの $PORT を参照するように設定
ENV SERVER_NAME=:10000
# 作業ディレクトリ
WORKDIR /app
# 所有権の変更 (ここが重要!)
# /app フォルダと、FrankenPHPが使う設定フォルダの所有者を appuser に変える
RUN chown -R ${USER}:${USER} /app /config/caddy /data/caddy
# 実行ユーザーの切り替え
# これ以降の命令や、アプリの実行は appuser 権限で行われる
USER ${USER}
壁打ちAIティーチャーの解説と回答
壁打ちAIティチャーに、FrankenPHPの「カスタムDockerイメージのビルド」の解説してもらうと‥
- 実際にやっていることは:
- どの PHP を使うか決める(FROM)
- Laravel のコードをコピーする(COPY)
- composer install する(RUN)
- Web サーバーを起動する(CMD)これだけです
とのこと。なるほど‥。
Render.com のマニュアルに、なぜroot権限を禁止していると明記していないのか、壁打ちAIティーチャーにツッコミ?を入れました
- Render.comに限らずコンテナ系PaaS共通の “実装上の制約” です
とのこと。はい、教養(常識?)が足りませんでした(反省)。
言われてみれば確かに‥という気も。root(に近い)権限があったら、かえって危ない。
こうして人は学習する。
さらに今回のデバッグについて
- 「インフラ(Render.com)側の制約」と「アプリ(FrankenPHP)側の要求」がぶつかった結果であり、解決策はアプリ側の設定にある、という構造になっています
という、なるほど‥なコメントをいただきました。
デバッグの細道のひとりごと(反省と感想)
そもそも "root権限" というとVPSサーバーの文脈での印象しかなく‥(VPSサーバーへのデプロイ経験はありません)。
「Capabilities(ケーパビリティ)」といった Linux の仕組みへの理解が、今後の課題です。
そもそもFrankenPHPがどういうものなのか、認識がほとんどなかった(汗)、とも言えます。
それらは動かしてエラーが出たからこそ見えてきたこと、なのかもしれません。
コードの記述が何をどう処理しているのか。
AIティーチャーのサポートがあるご時世だからこそ、
エラーとデバッグを通して、コードの記述内容や実行環境などついて、もっと理解を深めていく必要を感じました。
学習、反省、また学習。
読んでいただいて、お疲れ様でした。
ありがとうございました。