🎯 はじめに
ターミナル操作を録画して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 が設定されていない場合、そのままコンテナの起動コマンドとして渡されます。」
しかし、これを 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 生成ツール