OpenCVが使われているソースをCloud Functionsにデプロイするとエラー

 

結論

requirements.txtに書いているOpenCVの依存関係をすべてopencv-python-headlessに置き換えましょう。

 

経緯

FirebaseのFunctionsでOpenCVを使ったプログラムを動かそうとしていました。
言語はPythonです。
実装を行い、ローカルでのエミュレータ起動でもエラー無く実行できていたのであまり気に留めていなかったのですが、
いざ、Functionsにデプロイすると以下のエラーが。

Error: There was an error deploying functions

 

エラーメッセージはこんな感じ。

Could not create or update Cloud Run service '{Service Name}', Container Healthcheck failed. Revision '{Revision Name}' is not ready and cannot serve traffic. The user-provided container failed to start and listen on the port defined provided by the PORT=8080 environment variable.


DeepL訳↓

Cloud Run サービス '{サービス名}' を作成または更新できませんでした。リビジョン '{リビジョン名}' は準備ができていないため、トラフィックを提供できません。ユーザーが提供したコンテナは、PORT=8080 環境変数で定義されたポートでの起動とリッスンに失敗しました。

 

環境変数とか権限周りの設定ミスかな?と最初は思っていたのですが、Cloud Runのログを見てみると以下のエラーが出ていました。

ImportError: libGL.so.1: cannot open shared object file: No such file or directory

 

なるほど。
libGL.so.1 つまりOpenCVのライブラリがインポートできていないと。
エラー発生箇所も

import cv2


の部分でした。

調べてみると、依存関係を制御するrequirements.txtopencv-pythonopencv-python-headlessに置き換えることで動くようになる。と。
しかし、エラーは変わらず。


さらに調べてみると、requirements.txtopencv-contrib-pythonの記述があることに気が付きました。それを削除してみると・・・

 

デプロイが成功しました!

 

なるほど。Cloud Run上でインポートできないライブラリが依存関係にあるとエラーを起こす。と。。
分かんないよなぁ・・・・。