新しいディストリビューションにコンパイルされた古いディストリビューションのアプリケーションのデプロイ

新しいディストリビューションにコンパイルされた古いディストリビューションのアプリケーションのデプロイ

ubuntu:latestのdockerコンテナに基づいて構築されたバイナリがあります。ubuntu 20たとえば、ubuntu:latestでこのバイナリを実行するにはどうすればよいですかubuntu 16

私はUbuntu 16のバージョンがバイナリがリンクされたlibc.soUbuntu 20のバージョンと互換性がないという事実に直面することができることを知っています。libc.soGLIBC symbols is not found

この状況で最良の方法は何ですか?システムライブラリとの静的リンクおよび各ターゲットプラットフォームでの構築は考慮されません。

ビルドプラットフォームからターゲットプラットフォームまで、すべてのシステム共有ライブラリ(など)を使用できるようにlibcする方法は? ubuntu 16で実行されている私のアプリケーションは、接続されたubuntu 20を使用します。 (たとえば、希望のルートを指定します)libpthreadld.solibclibcLD_LIBRARY_PATH

このアプローチを使用すると、どのような問題に直面しますか?

ベストアンサー1

以前のディストリビューションで「新しい」バイナリを実行するために必要なすべてを提供しようとすると、最終的に複雑になり、やや不安定になります。興味がある場合は、SteamランタイムまたはFlatpakランタイムを確認してください。全体の生態系にとってはそれほど価値がありますが、単一のバイナリにはあまりにも多くの努力が必要だと思います。

バイナリを構築できるコンテナ記述子はすでに存在しているため、すべてのターゲット展開に対して調整することをお勧めします。これにより、どこでも正しい依存関係を使用してバイナリを構築し、依存関係が必要かどうかをユーザーが知る前に知ることができます。調整しました。

必ずしも排他的ではありませんが、他のオプションもあります。

コンテナイメージにバイナリを提供することを選択できます。コンテナがうまく構築されると、オーバーヘッドが最小限に抑えられます。実際、バイナリに必要なランタイムを提供するために必要なオーバーヘッドは、現在検討中のオプションと同じであり、はるかに脆弱ではありません。

考慮すべき別のオプションは、バイナリを静的に構築するか、最小共通分母(例えばRHEL7)。新しいリリースへの古い依存関係は可用性の問題を引き起こす可能性がありますが、通常、これらの問題は最初のアプローチよりも優れた方法で解決できます。

おすすめ記事