Docker環境の Ruby 3.3へのアップグレード問題とその解決方法

目次

問題の概要

Ruby 2.6.5やRuby 2.7.6等の古いバージョンのRubyを利用しているDocker環境において、Rubyのバージョンを3.3にアップグレードすると、`ruby` コマンドが実行できなくなる問題が発生しています。
gem updateやbundle install等も同様に実行できない状態でした。

rbenvなどで同じコンテナ内のRubyをバージョンアップしてみても、ruby コマンド実行時にエラーが発生してしまい、同様に実行できませんでした。

error while loading shared libraries: libruby.so.3.3: cannot open shared object file: No such file or directory

一方で、Ruby 3.2のDockerイメージでは問題なく`ruby` コマンドが実行できました。
今回はDocker環境でRubyのバージョンを2.x系から3.3に上げるための解決策を記事にしたいと思います。

原因と解決策

  • 原因
    この問題は、Rubyのメジャーバージョンアップに伴う互換性の問題や、既存のDockerボリュームに残存する古い設定や依存関係が原因で起こります。
  • 前提
    システム開発をしているソースコード類はGithubなどで管理されているものとして、Dockerイメージ、ボリュームを削除しても再度ビルドすることで最新のソースコードをマウントできる環境であることを前提とします。
  • 解決策
    1.Dockerボリュームの削除
     まず、既存のRuby 2.x系統で作成されたDockerボリュームを削除します。これにより、古いバージョンのRubyやその依存関係が完全に削除されます。

    shコマンド
    $ docker volume rm [ボリューム名] or [volume_id]

    2.新しいDockerイメージのビルド
     Dockerfileを更新し、Rubyの最新版を指定して新しいDockerイメージをビルドします。
     (※2024/4/22現在、latestを指定するとruby3.3.0が導入されました)
Dockerfile
FROM ruby:latest
ENV LD_LIBRARY_PATH /usr/local/lib:$LD_LIBRARY_PATH

WORKDIR /my_app
COPY Gemfile /my_app/Gemfile
COPY Gemfile.lock /my_app/Gemfile.lock
RUN bundle install
COPY . /my_app

RUN apt update && apt install -y default-mysql-client

CMD ["rails", "server", "-b", "0.0.0.0"]

shコマンド
$ docker build -t my-ruby-app:latest .

 3.環境のテスト
  新しいイメージを使用してコンテナを起動し、ruby コマンドが正常に実行されるかを確認します。

shコマンド
docker run -it --rm my-ruby-app:latest ruby -v

まとめ

Rubyのバージョンアップ、特にメジャーバージョンが変わる際には、互換性の問題や設定の違いが原因でエラーが発生することがあります。
Docker環境ではこれらの問題を解決するために、関連するボリュームやイメージを削除し、新しいバージョンのイメージをクリーンな状態でビルドすることが重要です。

役に立ったらシェアしていただけると嬉しいです
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次