🐳

Docker環境でRailsのファイル作成時に「Permission denied」が発生したときの解決法

に公開

はじめに

Docker環境でRailsアプリを開発しているときに、モデルやマイグレーションファイルを作成しようとしたら、以下のようなエラーに遭遇したことはありませんか?

Errno::EACCES: Permission denied @ rb_sysopen - /rails/app/models/example.rb

これは、コンテナ内のユーザーに適切なファイルの書き込み権限がないために発生する問題です。本記事では、このエラーの原因と解決策を解説します。

エラーの原因

このエラーの原因は、Railsコンテナ内のユーザーが、アプリケーションディレクトリ内のファイルに対して適切な権限を持っていないためです。
一般的に、Dockerコンテナのデフォルトのユーザーは root ではなく、アプリケーション用に作成された rails ユーザーなどが割り当てられています。

コンテナ内で以下のコマンドを実行し、現在のユーザーを確認してみましょう。

whoami

もし railsapp などのユーザーになっている場合、そのユーザーが /rails ディレクトリの所有権を持っていない可能性があります。

現在のディレクトリの所有者を確認するには、以下のコマンドを実行します。

ls -l /rails

もし root root となっている場合、rails ユーザーが書き込みできるように権限を変更する必要があります。

解決策

1. ファイルの所有権を変更する

コンテナ内で以下のコマンドを実行し、Railsアプリのディレクトリの所有権を変更します。

chown -R rails:rails /rails

このコマンドは、rails ユーザーが /rails ディレクトリ内のすべてのファイルを所有するように変更します。

もし chown コマンドが権限不足で実行できない場合、コンテナを再起動して root ユーザーでログインし、再度実行してみてください。

docker restart <コンテナ名>
docker exec -it --user root <コンテナ名> bash
chown -R rails:rails /rails
exit

その後、通常の rails ユーザーで再度ログインして、問題が解決しているか確認しましょう。

2. Dockerfile で適切なユーザーを設定する

Dockerfile 内で、rails ユーザーを作成し、適切な権限を設定しておくと、コンテナ起動時に問題が発生しにくくなります。

修正前の Dockerfile

FROM ruby:3.2.7

WORKDIR /rails

COPY . .

CMD ["bin/rails", "server", "-b", "0.0.0.0"]

修正後の Dockerfile

FROM ruby:3.2.7

WORKDIR /rails

RUN groupadd --system --gid 1000 rails && \
    useradd rails --uid 1000 --gid 1000 --create-home --shell /bin/bash && \
    chown -R rails:rails /rails

USER rails

COPY . .

CMD ["bin/rails", "server", "-b", "0.0.0.0"]

この修正により、コンテナ内の rails ユーザーが適切な権限を持つようになります。

3. 再起動して権限の変更を適用

上記の変更を適用するために、コンテナを再ビルド・再起動します。

docker-compose down
docker-compose build
docker-compose up -d

その後、もう一度モデルを作成してみましょう。

docker exec -it <コンテナ名> bash
rails generate model Example title:string content:text

これで、エラーなくファイルが作成できるはずです。

まとめ

Docker環境でRailsアプリを開発する際、コンテナ内のユーザー権限の問題でファイルが作成できないことがあります。
この問題を解決するには、以下の手順を実行しましょう。

  1. ls -l コマンドで所有者を確認する
  2. chown -R rails:rails /rails で所有権を変更する
  3. Dockerfile で適切なユーザーを設定する
  4. コンテナを再起動して変更を適用する

Discussion