No such file or directory - bs_fetch:atomic_write_cache_file:chmod

No such file or directory - bs_fetch:atomic_write_cache_file:chmod

docker-composeを使ってサーバーとsidekiq両方を動かそうとすると次のようなエラーが出る場合があります:

$ docker-compose up
app_1          | [12] Puma starting in cluster mode...
app_1          | [12] * Version 4.1.0 (ruby 2.6.3-p62), codename: Fourth and One
app_1          | [12] * Min threads: 5, max threads: 5
app_1          | [12] * Environment: development
app_1          | [12] * Process workers: 2
app_1          | [12] * Preloading application
app_1          | [12] ! Unable to load application: Errno::ENOENT: No such file or directory - bs_fetch:atomic_write_cache_file:chmod
app_1          | bundler: failed to load command: puma (/usr/local/bundle/bin/puma)
app_1          | Errno::ENOENT: No such file or directory - bs_fetch:atomic_write_cache_file:chmod
app_1          |   /usr/local/bundle/gems/bootsnap-1.4.5/lib/bootsnap/compile_cache/iseq.rb:37:in `fetch'

簡略化しますが、docker-compose.ymlはだいたいこんなかんじ。appを2つのコンテナが共有している状態:

version: "3"
services:
  app:
    build: .
    command: bundle exec puma
    volumes:
      - .:/app
    ports:
      - "8080:8080"
    links:
      - redis
  sidekiq:
    build: .
    command: bundle exec sidekiq
    volumes:
      - .:/app
    links:
      - redis
  redis:
    image: redis
    volumes:
      - ./tmp/db:/var/lib/redis/data

おそらく、サーバーが立ち上がってからbootsnapで生み出されるapp/tmp/cacheappコンテナとsidekiqコンテナの両方が読み込もうとしてエラーが起きている様子。であれば、キャッシュフォルダをマウントしないか、bootsnapをsidekiqコンテナでは使わないようにしてあげれば良さそうです

    volumes:
      - .:/app
      /app/tmp/cache