こんにちは!今回は自分の備忘録と、同じ境遇に遭われている方のためにDocker上でActive Storageが使えず、写真が表示できないというエラーで苦しまないように記録しておきます。
時間がなく、とりあえず解決したいという方は目次:解決法!をご覧ください。
もし、興味がありましたらDockerの概念を解説した記事も読んでくださると嬉しいです。
キーワード:Docker、Active Storage
現状の説明
まずどういう状況でエラーが発生したかを説明します。
使用技術
Docker:27.2.0
Rails:7.0.6
Ruby:3.2.2
MySQL:9.0
ちなみに、あらかじめ開発したRailsアプリケーションをDocker上に配置して、docker-compose up
してサーバーを起動し、画像が表示されるページを開いたらエラーが発生しました。
そのときのエラーが以下の通りです。(一字一句同じというわけではないです。)
Could not open library 'vips.so.42': vips.so.42: cannot open shared object file: No such file or directory.
Dockerfileとdocker-compose.ymlは以下のように記述していました。(Docker初心者なので今回のエラー原因以外に改善したほうがいいところがありましたら、お問い合わせのところからご教示いただけると幸いです。)
services: db: image: mysql:9.0 environment: MYSQL_USER: user MYSQL_ROOT_PASSWORD: sauna-tankentai ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql web: build: context: . dockerfile: Dockerfile command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" tty: true #擬似端末をコンテナに結びつける stdin_open: true #標準入出力とエラー出力をコンテナに結びつける depends_on: - db ports: - "3000:3000" volumes: #myappに反映する - .:/myapp volumes: mysql_data:
FROM ruby:3.2.2 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs default-mysql-client vim RUN apt-get update -qq && apt-get install -y imagemagick RUN mkdir /myapp # コンテナ内にmyappディレクトリを作成 WORKDIR /myapp # myappディレクトリを作業用ディレクトリとして指定 COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install # コンテナ内におけるGemfileのbundle install COPY . /myapp
以上の状況でエラーが発生していました。
解決法!
今回、Dockerfileにlibvips42
のインストールをする記述をしていないことが原因でした。そのため、以下のようにDockerfileを修正したら解決しました!
FROM ruby:3.2.2 RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs default-mysql-client vim RUN apt-get update -qq && apt-get install -y imagemagick libvips42 #追加 RUN mkdir /myapp # コンテナ内にmyappディレクトリを作成 WORKDIR /myapp # myappディレクトリを作業用ディレクトリとして指定 COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install # コンテナ内におけるGemfileのbundle install COPY . /myapp
上記のコードのようにapt-get install -y libvips42
を記述したところlibvips42をインストールすることができ、エラーが解決しました。
エラーの原因
今回のエラー表記をもう一度確かめます。
Could not open library 'vips.so.42': vips.so.42: cannot open shared object file: No such file or directory.
vips.so.42というライブラリが開けなかったよ♡、と言われています。
libvipsとは何か調べたところ、Rails7においてActive Storageがデフォルトで使用するライブラリだそうです。(もし、間違えていたらすみません。)
そのライブラリが見つからないと言われていることから、ライブラリのパスがおかしい、ライブラリがそもそもない、分からんからとりあえず寝るという3つの選択肢を私は考えました。
Dockerを使用する前は、しっかりと動作していたのでライブラリがインストールされていないという選択肢は勝手に捨てていました。これがエラー解決にめっっっっっっちゃ時間がかかってしまった原因です。反省、、、
ライブラリが見つからないと言われているが、他のライブラリは問題なく使用されているということから、そもそもライブラリが存在していないのでは?と考えるべきでした。
おわりに
今回は、Docker上にRailsアプリケーションを配置したら画像を表示する際にエラーが発生してしまったときの解決法をまとめました。
エラー文と現在の状況から適切な思考プロセスを辿れるようにしたいと思いました。
ライブラリが見つからないと言われたときは、そのライブラリがそもそもインストールされているか確認するとよいです(for me)。
コメント