docker execで「OCI runtime exec failed」エラーが出る原因と対処法【3つの原因別に解説】

Dockerエラー対処

docker execで「OCI runtime exec failed」エラーが出て困っていませんか?

docker exec でコンテナに入ろうとしたとき、以下のようなエラーが表示されて「docker execで入れない」と困った経験はありませんか?

$ docker exec -it my-container bash
OCI runtime exec failed: exec failed: unable to start container process: exec: "bash": executable file not found in $PATH: unknown

このエラーは docker exec のエラーの中でも非常によく見かけるものです。原因は大きく3つに分かれます。この記事では、それぞれの原因と対処法を具体的なコマンド付きで解説します。

原因1: コンテナにbashが入っていない(Alpine Linuxなど軽量イメージ)

なぜ起きるのか

最も多い原因がこれです。Alpine LinuxベースのDockerイメージには、サイズを小さくするために bash が含まれていません。代わりに軽量な sh(ash)のみがインストールされています。

たとえば、nginx の公式イメージには Alpine 版があります。

$ docker run -d --name my-nginx nginx:alpine
$ docker exec -it my-nginx bash
OCI runtime exec failed: exec failed: unable to start container process: exec: "bash": executable file not found in $PATH: unknown

「bash not found docker」と検索してこの記事にたどり着いた方も、このケースに該当する可能性が高いです。

対処法: sh を使ってコンテナに入る

bash の代わりに sh を指定すれば、問題なくコンテナに入れます。

$ docker exec -it my-nginx sh
/ #

💡 shとbashの違い
sh は POSIX 準拠の基本的なシェルです。タブ補完や矢印キーでの履歴呼び出しなど、bash にある便利機能の一部が使えませんが、コンテナ内でファイルを確認したりコマンドを実行する分には十分です。

どうしてもbashを使いたい場合

Alpine ベースのコンテナ内で bash をインストールすることもできます。

$ docker exec -it my-nginx sh
/ # apk add --no-cache bash
/ # bash
bash-5.2#

⚠️ 本番環境ではインストールは推奨されません
開発・デバッグ目的の一時的な対処としてのみ使ってください。本番コンテナにパッケージを追加すると、イメージの軽量さというメリットが失われます。

原因2: コンテナが停止している

なぜ起きるのか

docker exec実行中のコンテナに対してのみ使えるコマンドです。停止しているコンテナに docker exec を実行すると、エラーになります。

$ docker exec -it my-container sh
Error response from daemon: container xxxxxxx is not running

「OCI runtime exec failed」とは少し異なるエラーメッセージですが、「docker exec エラー」として一緒に調べる方が多いので、あわせて紹介します。

対処法: docker start してから exec する

まず、コンテナの状態を確認しましょう。

$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   STATUS                     NAMES
abc123         ubuntu    "bash"    Exited (0) 5 minutes ago   my-container

STATUSExited になっている場合、コンテナは停止しています。docker start で起動してから docker exec を実行してください。

$ docker start my-container
$ docker exec -it my-container sh

💡 docker run -it との違い
docker run -it は新しいコンテナを作成して起動するコマンドです。既存のコンテナに入りたい場合は docker startdocker exec の流れになります。詳しくはdocker run -it の解説記事をご覧ください。

原因3: 指定したコマンドがコンテナ内に存在しない

なぜ起きるのか

bash だけでなく、コンテナ内に存在しないコマンドを指定した場合も同じエラーが発生します。

$ docker exec -it my-container python
OCI runtime exec failed: exec failed: unable to start container process: exec: "python": executable file not found in $PATH: unknown

対処法: 利用可能なシェル・コマンドを確認する

コンテナ内でどのシェルが使えるか確認するには、以下のように ls コマンドでチェックします。

# sh が使える場合、コンテナに入ってから確認
$ docker exec -it my-container sh
/ # which bash
/ # which sh
/bin/sh
/ # which ash
/bin/ash

あるいは、コンテナに入らずに直接確認する方法もあります。

$ docker exec my-container ls /bin/sh
/bin/sh

$ docker exec my-container ls /bin/bash
ls: /bin/bash: No such file or directory

💡 cat /etc/os-release で OS を確認
コンテナのベース OS がわかれば、使えるシェルの見当がつきます。

$ docker exec my-container cat /etc/os-release
NAME="Alpine Linux"
...

bashが使えるイメージと使えないイメージ一覧

よく使われる Docker イメージについて、bash の有無を一覧にまとめました。

イメージ ベースOS bash sh 備考
ubuntu Ubuntu ✅ あり ✅ あり bashがデフォルトシェル
debian Debian ✅ あり ✅ あり bashがデフォルトシェル
centos / rockylinux RHEL系 ✅ あり ✅ あり bashがデフォルトシェル
node Debian ✅ あり ✅ あり node:alpine は bash なし
python Debian ✅ あり ✅ あり python:alpine は bash なし
alpine Alpine Linux ❌ なし ✅ あり ash(sh互換)のみ
busybox BusyBox ❌ なし ✅ あり 最小限のユーティリティのみ
nginx:alpine Alpine Linux ❌ なし ✅ あり 通常の nginx は bash あり
gcr.io/distroless/* Distroless ❌ なし ❌ なし シェル自体が存在しない

⚠️ distroless イメージについて
Google が提供する distroless イメージには、sh すら含まれていません。そのため docker exec でシェルに入ること自体ができません。デバッグ用途には debug タグ付きのイメージを使いましょう。

# distroless の debug バリアントには busybox の sh が含まれている
$ docker run -d --name my-app gcr.io/distroless/base-debian12:debug ...
$ docker exec -it my-app sh

実践的な確認手順フロー

「OCI runtime exec failed」エラーが出たときは、以下の手順で原因を切り分けてください。

ステップ1: コンテナが実行中か確認する

$ docker ps -a --filter "name=コンテナ名"

→ STATUS が Up なら実行中です。Exited なら docker start コンテナ名 で起動してください。

ステップ2: sh でコンテナに入れるか試す

$ docker exec -it コンテナ名 sh

→ 入れたら、bashが存在しないだけです。sh をそのまま使いましょう。

ステップ3: sh でも入れない場合、ベースイメージを確認する

$ docker inspect コンテナ名 --format '{{.Config.Image}}'

→ distroless イメージの場合はシェル自体が存在しないため、debug バリアントの利用を検討してください。

ステップ4: 特定のコマンドを実行したい場合

# コンテナ内にコマンドがあるか確認
$ docker exec コンテナ名 which 実行したいコマンド

→ コマンドが見つからない場合は、コンテナ内にインストールするか、そのコマンドを含むイメージを使い直す必要があります。

まとめ

docker exec で「OCI runtime exec failed」エラーが出る主な原因は次の3つです。

  1. bashがインストールされていないsh を使う(Alpine 系に多い)
  2. コンテナが停止しているdocker start してから docker exec する
  3. 指定したコマンドが存在しないwhichls /bin/ で確認する

多くの場合、bashsh に変えるだけで解決します。まずは以下のコマンドを試してみてください。

$ docker exec -it コンテナ名 sh

Dockerの基本的なコマンド操作についてはDocker主要コマンドの解説記事を、イメージとコンテナの関係についてはイメージとコンテナの違いの解説記事もあわせてご覧ください。

Dockerの基礎を動画で体系的に学びませんか?

実務で使う基礎だけを3時間に凝縮。環境構築から丁寧に解説しています。

Udemy Docker入門講座 クーポン割引で講座を見る →

コメント

タイトルとURLをコピーしました