0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LaravelのappをRender.com × Dockerfile × FrankenPHP × でデプロイしたら、ログに「frankenphp: operation not permitted」が出た話 【デバッグの細道】

0
Posted at

概要

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でデプロイできました。
※デプロイはできたものの、次の問題(エラー)が‥。それはまた別の記事にて。

Dockerfile
# 注:今回のエラー・デバッグに関する部分のみ抜粋

# --- 非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ティーチャーのサポートがあるご時世だからこそ、
エラーとデバッグを通して、コードの記述内容や実行環境などついて、もっと理解を深めていく必要を感じました。

学習、反省、また学習。

読んでいただいて、お疲れ様でした。
ありがとうございました。

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?