DockerでActive Storageが使用できなくて困った話

Rails

こんにちは!今回は自分の備忘録と、同じ境遇に遭われている方のために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)。

コメント

タイトルとURLをコピーしました