Skip to content

Docker exec format error

Docker でカスタムイメージを作成し実行しようとした際に exec /usr/bin/sh: exec format error というエラーが発生することがあります。このエラーは様々な原因で発生する可能性があり、特にマルチアーキテクチャ環境でよく見られます。

問題の概要

exec format error は、Docker コンテナ内で実行ファイルやスクリプトの形式が正しく認識されない場合に発生します。具体的には以下のようなシナリオで発生します:

bash
# エラーの例
exec /usr/bin/sh: exec format error

このエラーが発生すると、コンテナの起動に失敗し、CI/CD パイプラインや本番環境でのデプロイが妨げられます。

主な原因と解決策

1. アーキテクチャの不一致(最も一般的な原因)

異なるCPUアーキテクチャ間でイメージをビルド・実行しようとすると発生します。例えば、Apple M1/M2チップ(ARM64)でビルドしたイメージをx86_64環境で実行する場合などです。

確認方法

bash
# イメージのアーキテクチャを確認
docker image inspect your-image-name | grep -E "(Architecture|Variant|Os)"

解決策

方法A: 明示的なプラットフォーム指定でのビルド

dockerfile
# Dockerfileでベースイメージのプラットフォームを指定
FROM --platform=linux/amd64 ubuntu:20.04
RUN apt-get update && apt-get install -y software-properties-common python3-pip
RUN pip3 install robotframework
bash
# ビルド時にプラットフォーム指定
docker build --platform=linux/amd64 -t your-image-name .

方法B: buildxを使用したマルチアーキテクチャビルド

bash
# buildxのセットアップ(初回のみ)
docker buildx create --use

# マルチプラットフォームビルド
docker buildx build --platform linux/amd64,linux/arm64 -t your-image-name .

方法C: CI/CD環境での対応

GitLab CI などの環境では、ランナーと同じアーキテクチャでイメージをビルドするように設定します。

2. スクリプトの書式問題

スクリプトファイルに適切なshebang(シバン)が記載されていない場合や、文字エンコーディング、改行コードの問題でも発生します。

解決策

bash
#!/bin/bash  # スクリプトの先頭にshebangを追加
# スクリプト内容
echo "Hello World"

WARNING

Windows環境で開発している場合は、改行コード(CRLF vs LF)や文字エンコーディング(UTF-8 with BOM)の問題にも注意が必要です。UTF-8(BOMなし)およびLF改行を使用するようにエディタを設定してください。

3. ファイルパスと権限の問題

スクリプトのパスが正しくない場合や実行権限がない場合にも同様のエラーが発生します。

解決策

dockerfile
# 正しい例 - カレントディレクトリからの相対パス
COPY ./script.sh /app/script.sh
RUN chmod +x /app/script.sh

# 誤った例 - 絶対パス(存在しない場合がある)
COPY /script.sh /app/script.sh

4. 実行ファイルの形式誤り

実行可能ファイルではないファイルを実行しようとしている可能性もあります。

dockerfile
# 誤った例 - テキストファイルを実行しようとしている
COPY --from=build /usr/config/file.txt /bin/service
RUN chmod a+x /bin/service
CMD ["./service"]  # file.txtを実行しようとするとエラー

その他の解決方法

Dockerシステムのクリーンアップ

場合によってはDockerシステムのキャッシュやイメージが破損している可能性があります。

bash
# Dockerシステムのクリーンアップ
docker system prune -a

AWS CodeBuild 環境での注意点

AWS CodeBuild を使用している場合、ビルド環境とデプロイ環境のアーキテクチャが一致していることを確認してください。特にARM64でビルドしたイメージをx86_64環境で実行するとこのエラーが発生します。

まとめ

exec format error の主な原因と解決策を以下の表にまとめます:

原因症状解決策
アーキテクチャ不一致ARM環境でビルド、x86で実行--platform=linux/amd64 指定
スクリプト書式問題shebangや改行コードの問題正しい書式とエンコーディングに修正
ファイルパス問題ファイルが存在しない or 権限不足正しいパス指定と権限設定
システムキャッシュ問題イメージやキャッシュの破損docker system prune -a 実行

TIP

最も確実な解決方法は、実行環境と同じアーキテクチャでDockerイメージをビルドすることです。開発環境と本番環境でアーキテクチャが異なる場合は、マルチアーキテクチャビルド(buildx)の使用を検討してください。

このエラーは根本的な原因を特定すれば解決可能です。まずはイメージのアーキテクチャを確認し、環境に合わせた適切なビルド方法を選択してください。