概要
WSL2でRemote Developmentを利用して、コンテナにアタッチしつつVSCodeを開いた際、サイドバーからGitを利用を試みると、Manage Unsafe Repositories
と記載されたボタンが表示される場合の対策を記載します。
要するにリポジトリの所有者とコンテナ内での実行ユーザーが異なるせいで出ている警告なので、実行ユーザーをリポジトリ所有者に合わせるようDockerfileを変更すればOK。他にも解決手法があるので、併せて記載します。
現象:リポジトリがUnsafeやぞ、ってやんわり怒られる
コンテナをビルドしてReopen in Containerした際、サイドバーからGitを利用を試みると、Manage Unsafe Repositories
と記載されたボタンが表示されます。
ボタンをクリックすると、画面上部に「安全なものとして扱い、開くリポジトリを指定しろ」といってリポジトリ選択UIが開きます。クリックすると、Gitによるソース差分確認機能等が使えるようになります。
ボタンをクリックすれば使えるは使えるけど、コンテナのビルドする度に復活するし、Unsafeとか言われると気分がよくないので、何とかしていきます。
原因:リポジトリの所有者とコンテナ内での実行ユーザーが異なるせい
以下例は、コンテナ内のルートディレクトリでls -al
を実行した結果です。リポジトリの所有者はnode
になっていますが、コンテナの実行ユーザーはroot
になっています。(ターミナルの実行ユーザーとして表示されているほか、whoami
コマンドでも実行ユーザーの確認ができる)
VSCodeのドキュメントによると以下の通り記載があり、リポジトリの所有者と実行ユーザーが食い違うせいであることが分かります。
VS Code uses git.exe for executing all Git operations. Starting with Git 2.35.2, users are prevented from running Git operations in a repository that is in a folder that owned by a user other than the current user as the repository is deemed to be potentially unsafe.If you try to open such a repository, VS Code will show a welcome view in the Source Control view or an error notification.
(VSCodeはすべてのGit操作を実行するためにgit.exeを使用します。Git 2.35.2以降、現在のユーザー以外のユーザーが所有するフォルダ内にあるリポジトリでGit操作を実行することが禁止されています。これは、そのリポジトリが潜在的に安全でないと見なされるためです。このようなリポジトリを開こうとすると、VSCodeはソース管理ビューにウェルカムビューを表示するか、エラー通知を表示します。)
(中略)
Marking a repository as safe will add the repository location to the safe.directory git configuration.
(リポジトリを安全としてマークすると、そのリポジトリの場所がGitのsafe.directory設定に追加されます。)(Visual Studio Code "Source Control FAQ")
ちなみに、リポジトリの所有者をコンテナ内ではなくWSL2側で確認すると、node
などコンテナのユーザーではなく、WSL2の実行ユーザーになる(ubuntu
とか) これは、WSL2側でGit clone
したユーザーと一致します。今回のケースはコンテナ内の実行ユーザーの問題なので、ここは気にする必要なしです。
対策
正攻法:コンテナ内実行ユーザーをリポジトリの所有者に合わせる
シンプルにDockerfileにて実行ユーザーをroot
から変更すればOK。そもそも、コンテナ内の実行ユーザーをroot
にすることは、セキュリティ上推奨されなかったはず(攻撃者がコンテナに入ったときに、サービス稼働に必要な権限以上に実行できる範囲が増えてしまう)
以下、Dockerfileの一例。
FROM node:18.19.0
USER node # この行がpoint!
WORKDIR /workspaces
WORKDIR /app
EXPOSE 4200
COPY package.json* package-lock.json* ./
RUN npm ci
ENTRYPOINT [ "npm", "run", "start", "--", "--host" , "0.0.0.0" ]
当然、コンテナで利用するイメージによって、指定するユーザーが誰かは変わるので都度確認してください。
Dockerfileを編集してコンテナをリビルド、Reopen in Container
すれば、リポジトリはUnsafeになっているはず。
他の方法
Unsafeな状態なのを受け入れつつ「いいからやれよ!」ってVSCodeに教えてあげる方法。Unsafeなままであることに変わりないので、あくまでも先述の実行ユーザー変更による対策を推奨としますが、、
リポジトリを安全なものとして登録する
WSL2側のターミナルなり、devcontainer.json
なりで、git config
コマンドから対象リポジトリを安全なものとして登録します。
devcontainer.json
で設定する場合、以下のように記載します。コンテナが作成された後にgit config
が走r。
{
"postCreateCommand": "git config --global --add safe.directory ${containerWorkspaceFolder}",
}