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?

【OCI permission denied 解決】Podmanでasciinema/aggを使うとスクリプト実行に失敗する理由と対策【ENTRYPOINTとcrunの罠】

Posted at

🎯 はじめに

ターミナル操作を録画してGIFにできる便利なツール asciinema/agg を Podman 上で自動実行しようとした際、以下のようなエラーに直面しました:

Error: preparing container ... for attach: crun: open executable: Operation not permitted: OCI permission denied

このエラーは特に ENTRYPOINT を空に設定した (ENTRYPOINT []) Containerfile を使っているときに発生しやすく、macOS + Podman + crun の構成で非常に起こりやすい問題です。

本記事では:

  • なぜこのエラーが起きるのか
  • なぜ ENTRYPOINT ["bash", "xxx.sh"] だと動くのか
  • なぜ ENTRYPOINT [] では落ちるのか
  • 解決策と背景となる仕様(Podman / OCI / crun)

を、公式ドキュメントに基づいて解説します。


🐳 再現環境とエラーの例

✅ Dockerfile

FROM ghcr.io/asciinema/agg

RUN sed -i 's|http://deb.debian.org/debian|http://archive.debian.org/debian|g' /etc/apt/sources.list && \
    apt update && \
    apt install -y python3-pip expect fonts-noto-color-emoji && \
    pip3 install asciinema

ENTRYPOINT []  # ← これが落とし穴

COPY run.sh /run.sh
RUN chmod +x /run.sh

このイメージをビルドして以下のように Podman で実行すると:

podman build -f Dockerfile -t agg-recorder .
podman run --rm agg-recorder

OCI permission denied が発生


💣 原因:ENTRYPOINT なし + crun 実行制限

このエラーの本質的な原因は、以下の組み合わせです:

要素 内容
ENTRYPOINT [] 明示的に ENTRYPOINT を無効化(CMD を直接実行)
Podman + crun 実行時に CMD を 直接 exec() しようとする
/run.sh のパーミッション コンテナ内で root になっていても 実行不可と判断される(特に crun)

🧾 Docker 仕様の公式ドキュメントによると…

「CMD は ENTRYPOINT が設定されていない場合、そのままコンテナの起動コマンドとして渡されます。」

📖 Dockerfile reference – CMD

しかし、これを Podman + crun で使った場合、コンテナのランタイムは CMD に記述されたファイルを直接実行 しようとし、実行属性が不十分だと即エラーで落ちます


🔎 crunの制約に関する情報

crun の GitHub イシューにも以下のような事例があります:

crun はセキュリティ的に非常に厳格な実行判定を行い、下記に該当すると即エラーになります:

  • noexec マウント上にあるファイルを exec しようとした
  • 実行ビットが付いていない
  • SELinux ラベルや AppArmor ポリシーに反する
  • OCI Runtime が /run.sh を exec しようとして失敗

✅ 解決策:ENTRYPOINT を明示的に bash にする

ENTRYPOINT ["bash", "/run.sh"]

これにより、Docker/Podman は bash を exec し、その引数として /run.sh を実行させる形になります。bash は中身を読み込んで実行するため、実行属性に依存せず安全に動作します。


✅ フル動作する Dockerfile の例

FROM ghcr.io/asciinema/agg

RUN sed -i 's|http://deb.debian.org/debian|http://archive.debian.org/debian|g' /etc/apt/sources.list && \
    apt update && \
    apt install -y python3-pip expect fonts-noto-color-emoji && \
    pip3 install asciinema

COPY . /data/
WORKDIR /data

ENTRYPOINT ["bash", "/data/run.sh"]

📦 なぜ ENTRYPOINT [] は危険なのか?

ENTRYPOINT [] ENTRYPOINT ["bash", "..."]
CMD の内容を直接 exec bash を介して実行
/run.sh が直接 OS の execve() 対象に /run.sh は bash に読み込まれるだけ
crun によって拒否されやすい 安定して実行される
パーミッションに依存する パーミッションを緩和できる

✅ まとめ

状況 対策
OCI permission denied が出る ENTRYPOINT ["bash", "/run.sh"] に変更
run.sh のパーミッションが原因 bash 経由での実行に切り替える
Podman + crun 環境 より厳しいため ENTRYPOINT に注意
絵文字が表示されない Notoフォント + --font-family を使う

CLI チュートリアル GIF 生成ツール

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?