はじめに
WSL2環境下でDockerを使い始めたのですが、パーミッションエラーがとにかくたくさん出たので対処方法を残しておきます。
開発環境
- Windows11マシン
- WSL2
- Ubuntu
- Rails
- Docker
※バージョン等詳細は今回は大事ではなさそうなので省きます
問題
rails new
rails g
などで作成したファイルでパーミッションエラーがでる。
具体的にはVSCODEで編集しようとすると保存できない。
前提
- Dockerでrails環境を構築
-
docker compose exec rails /bin/bash
でシェルを起動しrails new
などを行った
原因
-
rails new
などで作成したファイルのオーナーはデフォルトだとrootユーザーになる - VSCODEで編集・保存をするのはWSL2ユーザーになる
- デフォルトでは所有者でもグループでもないファイルに書き込み権限は付与されない
解決方法
WSL2のデフォルトユーザーをrootにする。
方法
-
Ubuntuターミナルを起動
# rootユーザーに切り替える $ sudo su - # Passwordを設定する $ passwd # このコマンドのあとにパスワード入力画面が表示
-
PowerShellを起動
# デフォルトユーザーをrootに変更 ubuntu config --default-user root
注意点
- rootは権限が強いので、万が一Windows側の重要なファイルを削除してしまうと大変なことになる
- 対応策:WSL2からWindows側のファイルへの書き込み権限をなくす
- ubuntuターミナルを起動
# wsl.confを編集する $ cd /etc $ nano wsl.conf
- 以下を追記
[automount] options="metadata,umask=22,fmask=11,ro"
- windowsを再起動
微妙に詰まったところ
- デフォルトがrootになるとルートディレクトリでlsをしても何も表示されない
-
cd /home/今まで使ってたusername
で今まで使っていたディレクトリをそのまま使える
他の方法
Dockerfileを書き換える
- USERを変えるように設定する
- 具体的には
USER $USERNAME
のような記述をDockerfileの最後の方で行うと、rails g
などのコマンドをrootではなく任意のusernameのユーザーにできる - 所有者が任意のユーザーになるので編集も可能
linuxのファイル作成時のデフォルト権限を変更する
- .bashrcに
umask 000
を記述する
おわりに
これで都度chmod
をする必要がなくなりました
参考
【Docker】 WSL 2 を利用したコンテナー内開発で権限をどう設定するべきか