Techioz Blog

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 イメージを更新する際の競合のリスクが軽減されます。