Docker Compose でのネイティブ依存関係の更新に Gem ボリューム ブレークを使用する
概要
Docker Compose で複数の Ruby サービスを実行し、Gem ボリュームを共有する場合、ネイティブ拡張を必要とする更新は、ベース イメージが更新されるときに中断されます。
次のような docker-compose ファイルがあるとします。
(...)
services:
ruby_service_1:
(...)
volumes:
- gems_volume:/usr/local/bundle
ruby_service_2:
(...)
volumes:
- gems_volume:/usr/local/bundle
(...)
これは、複数の Ruby サービスを扱うときに多くのガイドで見てきたパターンです。問題は、ベース イメージが更新されると (たとえば、公式 Ruby イメージのバージョンを上げた場合に発生します)、ネイティブ バインディングを持つ gem の .so ファイルが見つからないというエラーが発生することです。これを解決するには、docker compose down –volumes を使用してボリュームを削除します。 これを行うより良い方法はありますか、それとも gem に共有ボリュームを使用するときにこれに対処する必要があるだけですか?
ありがとう、 フィン
解決策
Ruby バンドルにとって、ボリュームの使用にはそれほど大きな利点はないと思います。 Docker分離の意味が失われる
おそらく、そのようなボリュームはまったく必要ありません。ただし、オプションとして、異なるサービスに対して異なるボリュームを定義できます。
services:
ruby_service_1:
volumes:
- ruby_service_1_gems:/usr/local/bundle
ruby_service_2:
volumes:
- ruby_service_2_gems:/usr/local/bundle
volumes:
ruby_service_1_gems: # Define the named volume for ruby_service_1
ruby_service_2_gems: # Define the named volume for ruby_service_2
このアプローチにより、各サービスの gem が分離され、ベースの Ruby イメージを更新する際の競合のリスクが軽減されます。