Docker exec format error
Docker でカスタムイメージを作成し実行しようとした際に exec /usr/bin/sh: exec format error
というエラーが発生することがあります。このエラーは様々な原因で発生する可能性があり、特にマルチアーキテクチャ環境でよく見られます。
問題の概要
exec format error
は、Docker コンテナ内で実行ファイルやスクリプトの形式が正しく認識されない場合に発生します。具体的には以下のようなシナリオで発生します:
# エラーの例
exec /usr/bin/sh: exec format error
このエラーが発生すると、コンテナの起動に失敗し、CI/CD パイプラインや本番環境でのデプロイが妨げられます。
主な原因と解決策
1. アーキテクチャの不一致(最も一般的な原因)
異なるCPUアーキテクチャ間でイメージをビルド・実行しようとすると発生します。例えば、Apple M1/M2チップ(ARM64)でビルドしたイメージをx86_64環境で実行する場合などです。
確認方法
# イメージのアーキテクチャを確認
docker image inspect your-image-name | grep -E "(Architecture|Variant|Os)"
解決策
方法A: 明示的なプラットフォーム指定でのビルド
# 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
# ビルド時にプラットフォーム指定
docker build --platform=linux/amd64 -t your-image-name .
方法B: buildxを使用したマルチアーキテクチャビルド
# buildxのセットアップ(初回のみ)
docker buildx create --use
# マルチプラットフォームビルド
docker buildx build --platform linux/amd64,linux/arm64 -t your-image-name .
方法C: CI/CD環境での対応
GitLab CI などの環境では、ランナーと同じアーキテクチャでイメージをビルドするように設定します。
2. スクリプトの書式問題
スクリプトファイルに適切なshebang(シバン)が記載されていない場合や、文字エンコーディング、改行コードの問題でも発生します。
解決策
#!/bin/bash # スクリプトの先頭にshebangを追加
# スクリプト内容
echo "Hello World"
WARNING
Windows環境で開発している場合は、改行コード(CRLF vs LF)や文字エンコーディング(UTF-8 with BOM)の問題にも注意が必要です。UTF-8(BOMなし)およびLF改行を使用するようにエディタを設定してください。
3. ファイルパスと権限の問題
スクリプトのパスが正しくない場合や実行権限がない場合にも同様のエラーが発生します。
解決策
# 正しい例 - カレントディレクトリからの相対パス
COPY ./script.sh /app/script.sh
RUN chmod +x /app/script.sh
# 誤った例 - 絶対パス(存在しない場合がある)
COPY /script.sh /app/script.sh
4. 実行ファイルの形式誤り
実行可能ファイルではないファイルを実行しようとしている可能性もあります。
# 誤った例 - テキストファイルを実行しようとしている
COPY --from=build /usr/config/file.txt /bin/service
RUN chmod a+x /bin/service
CMD ["./service"] # file.txtを実行しようとするとエラー
その他の解決方法
Dockerシステムのクリーンアップ
場合によってはDockerシステムのキャッシュやイメージが破損している可能性があります。
# 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)の使用を検討してください。
このエラーは根本的な原因を特定すれば解決可能です。まずはイメージのアーキテクチャを確認し、環境に合わせた適切なビルド方法を選択してください。