💬
WSL2+Docker構成でWindowsのVSCodeから直接ファイルを編集操作する
課題とやりたいこと
Docker コンテナ内で作成されるファイル(例:create-react-app して作成したファイルなど)は、デフォルトでは root 権限でファイルが作成されます。(-rw-r--r-- 1 root root
のようになります。)
※プロジェクトフォルダは、WSL 側のディレクトリ(例/home/[ユーザ名]/配下)に存在することを前提とします。
一方で通常、WSL2 は root 以外の権限のユーザ(ディストリビューションをインストールしたときに設定したユーザ)で動作するため、WSL2 上の OS のコンソール上でのユーザはsudo
しないと編集・実行権限がない状態になり、Permission denied
になります。
また、Windows から、VSCode 等で編集しようとした場合、上記の root 以外の権限のユーザが使用され、同じく編集権限がない状態Permission denied
になります。
これは、開発作業上問題があり、都度 chmod するのもよろしくと思われるため、Windows 上の VSCode などからコンテナと同様の権限で、直接ファイルを編集できるようにする必要があります。
解決方法
コンテナ内で作成したファイルをエディタで編集する場合、VSCode プラグインの Remote-Containers を用いて、WSL2→VSCode 用のコンテナ → 対象フォルダの経路で接続し、root 権限で動作するように設定することで対応できます。
手順
- ソースコードが格納されている対象のフォルダの権限が
root
になっている場合、一般ユーザ権限に変更しておきます(VSCode から操作したい対象フォルダそのもののみで OK です)。sample
というフォルダの権限を変更する場合、sudo chown username:username sample
のような形で変更できます。 - VSCode を起動し
Remote Development
というエクステンションパックをインストールする。 - VSCode のスタータスバーの左下にある緑のアイテムをクリックし、
Open Folder in WSL
を選択し、WSL 内の対象のプロジェクトフォルダを選択する。(WSL 側(Linux 側)からファイルを開きます) - VSCode のスタータスバーの左下にある緑のアイテムをクリックし、
ReOpen in Container
を選択する。 - 下に追加の選択メニューが表示されるので、
From a predefined container configuration definition
を選択する。 - 下に追加の選択メニューが表示されどのコンテナを使用するか聞かれるので、任意のものを選択する。(root ユーザで接続したいだけなので、どれでも問題ないと思われれる。軽量の alpine を選択してみました)
- vscode のプロジェクト直下に
.devcontainer
というディレクトリがつくられ、devcontainer.json
とDockerfile
が作成されるので、devcontainer.json
を開いて、user
設定がデフォルトはvscode
となっているので、root
に変更する。 - VSCode のスタータスバーの左下にある緑のアイテムから
Rebuild Container
を選択して設定を反映させる。
以降は VSCode で、次のいずれかの方法で接続することで、コンテナに接続できます。
パターン 1
- WSL 側コンソールから対象フォルダでコマンド
code .
で VSCode を起動する。 - VSCode のスタータスバーの左下にある緑のアイテムをクリックし、
ReOpen in Container
を選択してコンテナに接続する。
パターン 2
- VSCode を Windows 側から起動した状態で、
Open Folder in WSL
で対象フォルダに接続する。 - VSCode のスタータスバーの左下にある緑のアイテムをクリックし、
ReOpen in Container
を選択してコンテナに接続する
所感
- WSL2 はまだまだ発展途上(過渡期)のように思います。随時アップデートされていくと思いますので、徐々に利便性が上がっていくのではないかと思います。
- WSL2 を使用するときは、各操作を Windows と Linux のどちら側から実行しているのかをよく意識しないと、問題にぶつかったときに解消に時間を要してしまいそうですので気をつけたいところです。
Discussion