ECSのタスク起動時に「standard_init_linux.go」関連のエラーが出た場合の対処方法

2021.07.07

こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。

先日、ECSでタスクの起動をしようとした際に以下のエラーが発生しました。

standard_init_linux.go:219: exec user process caused: no such file or directory

このエラーを調べてみると、いくつか同じようなパターンとその対処方法が見つかったので、まとめておきたいと思います。

いつエラーが起きるのか

ECSのタスクを起動した直後にエラーが発生し、タスクがすぐに「STOPPED」になります。停止したタスクのログを調べると以下のようなログだけが出ている、という状況です。

standard_init_linux.go:219: exec user process caused: no such file or directory

エラーパターン

その1. exec user process caused: no such file or directory

こちらは私が遭遇したエラーです。エラーの原因と対処方法は以下の通りとなります。

前提

Dockefileで以下のようにCMDを指定しています。

Dockerfile

(...snip...)
CMD /usr/local/bin/foo-bar

foo-barは以下のように定義されたPythonスクリプトです。

/usr/local/bin/foo-bar

#!/usr/local/bin/python

import os
import base64
(...snip...)

エラー発生フロー

調査した結果、以下のようなエラーの発生フローでした。

  1. Dockerfile のCMDが呼び出される
  2. CMDに指定されたプログラムfoo-barが呼び出され、Shebangで指定したインタプリタで実行しようとする
  3. エラーが発生

エラーの原因

原因は「Shebangで指定した/usr/local/bin/pythonが存在しなかったため」でした。エラーメッセージの「no such file or directory」がまさにこれを示していますね。

今回エラーが発生した環境では、Dockerfileで指定するベースイメージを「これまで利用していたベースイメージ」から「別のベースイメージ」に変更を行っていました。このため、Pythonの実行パスが変わりエラーが発生した、という状況でした。

対処方法

対処方法はとても簡単で、Shebangの指定を正しいものに修正するだけでした。

今回のケースでは環境によって変わる絶対パスを指定していたのが要因の1つでもあったので、以下のようにenvを利用するように変更して対処しました。

#!/usr/bin/env python

pythonコマンドの実行時に「Pythonの バージョン2 と バージョン3 のどちらが動くか分からない」という環境では問題がありますが、「どちらもバージョン3が動く」というような環境であれば上記で良さそうです。

なお、今回遭遇したエラーはこのケースだったのですが、同様のエラーパターンとしていくつかあるようなので、以下にまとめておきたいと思います。

その2. (別パターン)exec user process caused: no such file or directory

こちらは上記の派生?パターンです。

エラーの原因

ファイルの改行コードがLFではなくCRLFになっていた、というパターンです。これは上記と関連していてENTRYPOINTCMDで指定したファイルにおけるインタプリタの解釈が、改行コードによって阻害されて失敗したケースです。

対処方法

このケースではインタプリタの指定は問題ないので、単純にファイルの改行コードをLFに修正するのみとなります。

参考

その3. exec user process caused "exec format error"

こちらは「exec format error」が表示されるパターンになります。

エラーの原因

イメージをビルドしたマシンと、コンテナを実行するマシンのCPUアーキテクチャが異なるために発生するエラーです。これはエラーメッセージから直感的に理解しやすいですね。

対処方法

このケースでは、可能であればアーキテクチャを合わせることで解消できます。

参考

その4. (別パターン)exec user process caused "exec format error"

こちらは「exec format error」が表示されるが、ちょっと分かりにくいパターンです。

エラーの原因

ENTRYPOINTCMDで指定したファイルで「Shebangを指定していなかった」場合に起きるエラーです。これはちょっとエラーメッセージからは推測しづらいですね。

対処方法

対処方法としては、ENTRYPOINTCMDで指定したファイルでShebangを指定してあげて、インタプリタを明示してあげれば良いですね。

参考

まとめ

以上、ECSのタスクコンテナ起動で「standard_init_linux.go」関連のエラーが出た場合の対処方法をまとめてみました。

調査したところでは、このエラーは主に上記の4パターンに分類されそうです。同様のエラーが発生して困ったときに、なにかの参考になったら嬉しいです。

どなたかのお役に立てば幸いです。それでは!