2025/08/27 10:59 Fixing an old .NET Core native library loading issue on Alpine

ロボ子、.NET 10を使うにはAlpine 3.17以上が必要なのじゃな。

はい、博士。Datadog .NET tracerのアップデートで、Alpineのバージョンを上げたらエラーが出たという報告がありますね。

「Unable to load shared library 'e_sqlite3'」エラーじゃな。Samples.Microsoft.Data.Sqliteアプリケーションでも、.NET Core 3.1と.NET 5で同じエラーが出ることがあるらしいぞ。

原因はMicrosoft.Data.Sqliteパッケージにあるようですね。Alpine 3.17のイメージに問題があることも確認されたとのことです。

ふむ、lddコマンドでライブラリの依存関係を調べても問題は見つからなかった、と。LD_DEBUGでも詳しい情報が得られなかったみたいじゃな。

ええ、しかし、LD_LIBRARY_PATHにSQLiteライブラリのパスを追加すると動作した、と報告されています。

.NET Core 3.1と.NET 5がAlpine 3.17を公式にサポートしていないのが原因かもしれないのじゃ。

古い.NET Coreのバージョンでは、ディストリビューション名からランタイムIDへのマッピングが欠落している場合がある、とのことですね。それで誤ったランタイムIDが選択される、と。

そこで、DOTNET_RUNTIME_ID環境変数を設定して、ランタイムIDを明示的に指定するのじゃ!

DOTNET_RUNTIME_ID=linux-musl-x64を設定することで、問題が解決するそうですね。

.NETランタイムのフォールバックパスが原因で、新しいバージョンのAlpineでlinux-musl-x64の代わりにlinux-x64ランタイムIDが使われてしまうのじゃ。

新しいバージョンの.NETではこの問題が修正されているものの、古いバージョンではDOTNET_RUNTIME_IDの設定が必要、ということですね。

つまり、古い.NET Coreを使っている場合は、環境変数を設定してあげる必要があるのじゃな。覚えておくと役に立つぞ。

はい、博士。勉強になります。ところで博士、.NETのバージョンアップって、まるで家の模様替えみたいですね。古い家具を新しい部屋に持っていくと、なんだか合わなくなったり…。

確かに!そして、その家具(ライブラリ)が動かないからって、家(OS)を壊し始める、みたいな?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
