VSCode/WSL2/Docker の組み合わせで遭遇するエラーとその対策


はじめに

Windows で Docker コンテナがらみの開発・動作確認をやってるとディスク IO がトロくて、近頃は WSL2 と組み合わせて Ubuntu の上に作業フォルダを作って VSCode で作業しているのですが ( npm 速いし )、ちょくちょく変なエラーが出ることがあるので、対策をまとめておきます。

リモート拡張ホスト サーバーへの接続に失敗しました

Failed to connect to the remote extension host server (Error: WebSocket close with status code 1006) 」などで報告されている問題で、現状未解決。
いい感じに回避策がまとめられてますのでそちらへ。要点は「プロキシ有無にかかわらず localhost に直接接続させること」と「LxssManager サービスを再起動すること」です。

(2021/03/30 追記)

これは VSCode のというより WSL2 の不具合 だそうで、 Insider Preview Build 20231 で解決しているそうです。とはいえ、これだけのために insider preview にアップデートするのはなぁ…。

<3>init: (4010) ERROR: UtilConnectToInteropServer:300: connect failed 2

なにこの謎のエラー?これが発生すると docker builddocker run が何も通らなくなって凹みます。これも「 [WSL2] [Interop] Keep a single shared /run/WSL/* socket 」などで既知の問題。
これはどうも、ソケット通信のソケット名を示す環境変数 WSL_INTEROP の値が「ずれてしまう」のが原因とのことで(なんでそんなことが?)、上記 GitHub issue に回避策が示されています。zsh の例として示されていますが、bash でも動きます。 .zshrc または .bashrc に下記のような関数を定義します:

fix_wsl2_interop() {
    for i in $(pstree -np -s $$ | grep -o -E '[0-9]+'); do
        if [[ -e "/run/WSL/${i}_interop" ]]; then
            export WSL_INTEROP=/run/WSL/${i}_interop
        fi
    done
}

エラーが発生したらいつでも fix_wsl2_interop を実行すればよい、という寸法。

他にもあったら追記していきます。