VSCode の Dev Containers、実はよくわかっていませんが以前あった Remote - Containers にシナリオが統合されたような環境ですかね。この時点でこのドキュメントを読むのが不安になると思うので結論を先に書いておきます。その後の試行錯誤も何かの役に立てば、、、
WSLリモート接続せずにWSL上のコンテナにアクセスするには
意味が分からないかもしれませんが、知りたい人にはこれで伝わると思います。詳しくは後程。
ローカルに Dev Containers 拡張をインストールします。次に拡張機能の歯車アイコンから「拡張機能の設定」を開きます。
ここに Dev - Containers: Execute in WSL
という項目があります。ここにチェックを入れるだけです。
WSLのデフォルトディストリビューション以外でコンテナを動かしている場合にはその下のディストロ名の設定も行います。
そもそも何の話か?
私は WSL 上にソースを置いて、WSL で起動した Docker(!= Docker Desktop)コンテナのデバッグを行うことが多いのですが、この使い方が一般的だろうと思っています。しかし、コンテナに VSCode を直接接続したいこともあります。
この場合、WSLリソースに接続した状態で更に Dev Containers リソースを見ると起動しているコンテナが一覧され、そこへ接続できます。しかし、Docker Desktop を使っている場合にはローカルリソース(つまりWindows上のファイル)を参照している時でもコンテナリソースへアクセスできます。
さほど、困っているわけでもないのですが、他人にコンテナへ接続する説明をするときにこの2段の接続をしてねというのも若干気の毒というか理解してもらう努力を惜しみたいなと。
そこで、Docker Desktop 同様にWindows上で docker コマンドが実行できればいいんじゃない?
と思い立ちました。
バッチファイルで docker コマンドを実現する
VScode も docker コマンドを介してコンテナとやり取りしているはずと思いバッチファイルを作成します。
@echo off
wsl -e %~n0 %*
これをパスの通っているところへ置いておきます。
docker ps
docker exec -it <container> sh
幾つかサブコマンドを発行してみましたが問題なさそうです。
VSCode で確認すると、Dev Containers のリストにコンテナが現れるようになりました。
ただ、接続してみるとエラーとなりここまでのようです。先ほどのバッチファイルで実行内容をファイルに書き出させると、inspection でコンテナの内容を確認した後、このコマンドは呼ばれません。コンテナの存在確認や起動などは docker コマンドで行うようですが、それ以外の操作が介在するようです。
Docker Desktop FAQを見ると、Dockerエンジンとの通信は名前付きパイプかソケットで行うようなのでこのあたりが足りないのかもしれません。
つまり、この方法では解決に至りません。Dev Containers ではうまくいきませんが、普段 Windows (コマンドプロンプト, PowerShell)で時々 WSL という人の場合には何か役に立つこともあるでしょう。
念のため、Dev Containers の設定を確認すると、そもそもこんな小技を挟まなくても WSL上の Docker を使うオプションがあったのでそれで解決というお話でした。