Docker Desktop を削除しWSL2のDockerを利用する

<!-- Docker Desktop を削除しWSL2のDockerを利用する -->

# 1. 読者の想定

- Docker Desktop をアンインストールしたが、WSL2上で、docker-compose（Plugin）が利用できなくなった人
- エラー内容としては、以下のような結果が表示される人
  - 今回トラブルシューティング個所はdocker-compose が使えない問題の解決

```bash
$ docker compose ps

docker: 'compose' is not a docker command.
See 'docker --help'
```

- WSL2上で思ったようにDev Container が利用できない場合など
  - wslでの開発が中心だが、Docker Desktop をインストールしている場合にWindowsを参照して困る人

エラーワードは以下のようになります。

- docker: 'compose' is not a docker command.
- input/output error
- error getting credentials - err: exec: "docker-credential-desktop.exe": executable file not found in $PATH, out:

# 2. 結論

「[WSL2上でDockerDesktopを使わなくなった後のエラー対応](https://til.swfz.io/entries/docker-error-in-wsl/)」 の内容と同じ解決方法で対応しました。

1. `~/.docker/config.json` の設定を変更
    1. 希望のエディタでconfigを開く。 `vi ~/.docker/config.json`
    2. 以下の設定を削除する
    3. `"credsStore": "desktop.exe"`

以降は原因を調べた方法について記載していますが、上記の手順を実行すれば問題は解決します。
以下の内容を確認すれば、問題の調査方法と原因について確認できます。

# 3. 概要

Docker Desktop は有料となり、業務では利用していないため自宅の環境からもDocker Desktop を削除しました。
その際に発生した問題の解決手順です。

原因は以下のような形で、`/mnt/wsl/docker-desktop/` へのシンボリックリンクが原因だろうと思います。desktop.exeを利用している場合ここを参照するようです。

```bash
ll /usr/local/lib/docker/cli-plugins/
total 40
drwxr-xr-x 2 root root 4096 Sep  1 11:30 ./
drwxr-xr-x 3 root root 4096 Apr 29 15:17 ../
lrwxrwxrwx 1 root root   80 Sep  1 11:30 docker-buildx -> /mnt/wsl/docker-desktop/cli-tools/usr/local/lib/docker/cli-plugins/docker-buildx*
lrwxrwxrwx 1 root root   81 Sep  1 11:30 docker-compose -> /mnt/wsl/docker-desktop/cli-tools/usr/local/lib/docker/cli-plugins/docker-compose*
lrwxrwxrwx 1 root root   77 Sep  1 11:30 docker-dev -> /mnt/wsl/docker-desktop/cli-tools/usr/local/lib/docker/cli-plugins/docker-dev*
lrwxrwxrwx 1 root root   83 Sep  1 11:30 docker-extension -> /mnt/wsl/docker-desktop/cli-tools/usr/local/lib/docker/cli-plugins/docker-extension*
lrwxrwxrwx 1 root root   78 Sep  1 11:30 docker-init -> /mnt/wsl/docker-desktop/cli-tools/usr/local/lib/docker/cli-plugins/docker-init*
lrwxrwxrwx 1 root root   78 Sep  1 11:30 docker-sbom -> /mnt/wsl/docker-desktop/cli-tools/usr/local/lib/docker/cli-plugins/docker-sbom*
lrwxrwxrwx 1 root root   78 Sep  1 11:30 docker-scan -> /mnt/wsl/docker-desktop/cli-tools/usr/local/lib/docker/cli-plugins/docker-scan*
lrwxrwxrwx 1 root root   79 Sep  1 11:30 docker-scout -> /mnt/wsl/docker-desktop/cli-tools/usr/local/lib/docker/cli-plugins/docker-scout*
```

# 4. 環境

- OS: Windows11
- WSL: WSL2
- Docker: Docker version 27.2.0
- Ubuntu: 22.04

WSL2, Windows10以上であれば対処方法に変化はないと思います。
修正箇所の内容から察するにWSLの場合（WSL2ではない）場合、対応方法が異なるかもしれません。

# 5. 問題の調査手順

ここは問題解決時の軌跡なので、同一症状か判断する目安にしてください。
私の場合はシンボリックリンクのリンク先を変更した後に別のエラーが発生し、本件の解決方法にたどり着きました。

解決につながったエラー:
`error getting credentials - err: exec: "docker-credential-desktop.exe": executable file not found in $PATH, out: `

## 5.1. エラー内容の確認 （以下の手順は解決につながりません）

1. docker compose ps を実行した結果、docker-compose のパスが異常であることを確認できたので内容を確認

    ```bash
    $ docker --help

    Usage:  docker [OPTIONS] COMMAND
    A self-sufficient runtime for containers
    Common Commands:
    run         Create and run a new container from an image
    exec        Execute a command in a running container
    ps          List containers
    bui

    # 省略

    # 以下のようにPluginsに問題が発生していることがわかる。
    Invalid Plugins:
    buildx      failed to fetch metadata: fork/exec /usr/local/lib/docker/cli-plugins/docker-buildx: input/output error
    compose     failed to fetch metadata: fork/exec /usr/local/lib/docker/cli-plugins/docker-compose: input/output error
    dev         failed to fetch metadata: fork/exec /usr/local/lib/docker/cli-plugins/docker-dev: input/output error
    extension   failed to fetch metadata: fork/exec /usr/local/lib/docker/cli-plugins/docker-extension: input/output error
    init        failed to fetch metadata: fork/exec /usr/local/lib/docker/cli-plugins/docker-init: input/output error
    sbom        failed to fetch metadata: fork/exec /usr/local/lib/docker/cli-plugins/docker-sbom: input/output error
    scan        failed to fetch metadata: fork/exec /usr/local/lib/docker/cli-plugins/docker-scan: input/output error
    scout       failed to fetch metadata: fork/exec /usr/local/lib/docker/cli-plugins/docker-scout: input/output error

    # 省略

    ```

2. まずは以下のコマンドで、適切なdocker-composeのパスを確認しておきました
   1. 私の場合は、`/usr/libexec/docker/cli-plugins/docker-compose` です
   2. 原始的ですが、`apt remove docker-compose-plugin` と`apt install docker-compose-plugin` でパッケージの確認を行いました

    ```bash
    $ sudo find / -name 'docker-compose' 2>/dev/null

    /etc/bash_completion.d/docker-compose
    /usr/libexec/docker/cli-plugins/docker-compose #これが正解ぽい
    /usr/bin/docker-compose
    # 省略
    ```

3. 適切なシンボリックリンクを貼り付け
   1. 私の場合、/bin/docker-compose -> /mnt/wsl/docker-desktop/cli-tools/usr/bin/docker-compose* となっていたので、以下のようにシンボリックリンクを貼りなおしました
   2. docker-composeの参照先は[公式](https://docs.docker.jp/compose/install/compose-plugin.html)を参考にしています

    ```bash
    sudo unlink /bin/docker-compose
    sudo ln -s /usr/libexec/docker/cli-plugins/docker-compose /bin/docker-compose
    # sudo ln -sf  /usr/libexec/docker/cli-plugins/docker-compose /bin/docker-compose を利用すれば、1行で実行できます（-f オプションで上書き）
    ```

4. 動作確認のため、`docker compose up` を実行する
5. `error getting credentials - err: exec: "docker-credential-desktop.exe": executable file not found in $PATH, out: ` のエラーが発生することを確認
   1. →[結論](#2.-結論)で述べた対応を実行することで解決します

# 6. （参考）Docker Desktop のアンインストール手順

正しいか確認していませんが、今回の解決方法を考慮した手順を記載しておきます。
極論、WSL上でdockerのインストールが完了していれば、[結論](#2.-結論) のconfig.jsonの編集のみでWSL上のdocker-composeを参照するはずです。

1. Docker Desktop を削除する
   1. Windowsのアプリのアンインストールでdocker を削除する
2. WSL2 上で、dockerコマンドを叩いてみる
   1. おそらく失敗するはずです
3. ~/.docker/config.json のファイル編集を行い、`"credsStore": "desktop.exe"` の設定を削除する
4. 念のため私は`/usr/local/lib/docker/cli-plugins/`のシンボリックリンクを削除しています。（気持ち悪かったので。）
    1. →（追記）シンボリックリンクを消さない場合は、`docker info`実行時に存在しないリンクを参照してWARNINGが出るようです。
    2. 別途以下のようなメッセージも表示されますが、こちらはDocker Desktopが提供しているblkio サブシステムの一部がサポートされていないことが原因のようです。

```bash
WARNING: No blkio throttle.read_bps_device support
WARNING: No blkio throttle.write_bps_device support
WARNING: No blkio throttle.read_iops_device support
WARNING: No blkio throttle.write_iops_device support
```

WSL2上でdockerをすでにインストールしている場合はここで終了です。

もしWSL2に全くdockerがインストールされていなかった場合は、[公式](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository)の手順に従い関連パッケージの remove 実行から始め、WSL2 にdockerをインストールしてください。