Docker上のRailsのActiveStorageでActiveStorage::IntegrityErrorが出る


背景

私は普段Railsのアプリ開発でDockerではなくローカル上のrbenvから起動しているので遭遇しなかったのですが、最近フロントの業務委託の方からセットアップ時に ActiveStorage::IntegrityError が出て作業が進められないという連絡があり、調査することになりました。

原因

Rails ActiveStorage IntegerityError Docker といったワードで検索したところ、まず最初にこちらのサイトが見つかりました。ここにあるgithubのissueを見たところ、どうも原因はDocker for Macのバグ?ということでした。

(一時的な)解決方法

いくつかあったのですが、手っ取り早い方法をいくつか

1. Docker for Macのダウングレード

先程のサイトにもあるように、とりあえずDocker for Macを3.2.2にダウングレードするのが手っ取り早いと思います。ただ「ダウングレードするのはちょっと・・・」という方は次の方法を試すと良いかもしれません。

2. TMPDIR の設定

こちらにあるように、一旦TMPDIR/tmpから/app/tmp等に変更する方法です。docker-composeを使っているのでしたら以下のようにenvironmentを設定することで簡単にできます。

docker-compose.yml
version: "3"
services:
  rails:
    environment:
      TMPDIR: /app/tmp

しかし、もちろんこの方法には TMPDIR: /app/tmpという余計な記述をコミットしてしまうというリスクがあります。ただフロントエンドのみを開発する方などはそのレポジトリ上でgit操作をすることもないので、そういう方にはおすすめかもしれません。また、このように手元のローカル上でのみ docker-compose.yml ファイルを上書きするのもアリかもしれませんね。

まとめ

完全に一時対応ではありますが、私の周り以外でも困っている方がいるかもしれないのでメモとして投稿しました。早めに根本的な原因のバグが直ると良いですね。もし他にもこういう良い方法があるとか、もうすでにこの構成だとそんな対応しなくても大丈夫とか、何か情報がありましたらぜひ教えてください。