目次
問題の概要
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環境ではこれらの問題を解決するために、関連するボリュームやイメージを削除し、新しいバージョンのイメージをクリーンな状態でビルドすることが重要です。
コメント