Closed4

WSL2のDockerでビルドする際,BuildKitとbuildxが見つからない

be4rrbe4rr

イメージのビルド時にこのようなエラー?警告?が出ました.イメージのビルド自体はうまくいきますが,Deprecated警告が出ています.

$ docker build . -t myapp
failed to fetch metadata: fork/exec /usr/local/lib/docker/cli-plugins/docker-buildx: no such file or directory

DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
            Install the buildx component to build images with BuildKit:
            https://docs.docker.com/go/buildx/

確認してみると,確かに/usr/local/lib/docker/cli-plugins/docker-buildxは存在していません.

詳しいことはわかりませんが,Docker v23.0.0からはデフォルトでBuildKitとBuildxを使ってイメージのビルドを行うようになるのでインストールしてくれということらしいです.
Legacy builder for Linux images

be4rrbe4rr

環境はWindows 11 WSL2で,WSLにDockerをインストールしています.インストール時には次の記事を参考にしました.
Running Docker on WSL2 without Docker Desktop (the right way)

改めて公式のインストール方法を見てみるとdocker-buildx-pluginをインストールしていますが,私が参考にしていた記事ではインストールしていません.

安直にsudo apt-get install docker-buildx-pluginしてみました.しかしイメージをビルトしようとするとまた同じエラーが出ます.

BuildKit での構築を有効化するには Docker-docs-jaを参考にしてBuildKitを使ったビルドを有効化しても特に効果はありません(Docker v23.0.0からはデフォルトでBuildKitを使うと言っているので,今思えばうまくいかなくて当然ですね).

be4rrbe4rr

調べていたらStackOverflowで同様のエラーに関する質問を見つけました.
docker Buildx "ERROR: BuildKit is enabled but the buildx component is missing or broken" error

以下の回答によると,WSL特有の問題のようです.

Did you maybe use Docker Desktop on Windows, uninstall it, and then tried to install Docker directly on WSL?
In that case you may have an issue that in /usr/local/lib/docker/cli-plugins/ you don't have actual files, but broken links to WSL installation. This happened to me.
To verify check output from: ls -la /usr/local/lib/docker/cli-plugins/
In my case, I rm these broken links, then rerun Docker installation on WSL and it solved the problem.

この回答にもあるように以前はWindowsでDocker Desktopを使っていましたが,最近になってDocker DesktopをアンイストールしてWSLに直接Dockerをインストールしました.そして/usr/local/lib/docker/cli-plugins/を確認してみると確かにシンボリックリンクがありました.しかしDocker Desktopをアンイストールしているので,リンク先/mnt/wsl/docker-desktopは存在しません.

$ ls -la /usr/local/lib/docker/cli-plugins/
total 32
drwxr-xr-x 2 root root 4096 Dec  8 18:07 .
drwxr-xr-x 3 root root 4096 Dec  8 18:07 ..
lrwxrwxrwx 1 root root   80 Dec  8 18:07 docker-buildx -> /mnt/wsl/docker-desktop/cli-tools/usr/local/lib/docker/cli-plugins/docker-buildx
lrwxrwxrwx 1 root root   81 Dec  8 18:07 docker-compose -> /mnt/wsl/docker-desktop/cli-tools/usr/local/lib/docker/cli-plugins/docker-compose
lrwxrwxrwx 1 root root   77 Dec  8 18:07 docker-dev -> /mnt/wsl/docker-desktop/cli-tools/usr/local/lib/docker/cli-plugins/docker-dev
lrwxrwxrwx 1 root root   83 Dec  8 18:07 docker-extension -> /mnt/wsl/docker-desktop/cli-tools/usr/local/lib/docker/cli-plugins/docker-extension
lrwxrwxrwx 1 root root   78 Dec  8 18:07 docker-sbom -> /mnt/wsl/docker-desktop/cli-tools/usr/local/lib/docker/cli-plugins/docker-sbom
lrwxrwxrwx 1 root root   78 Dec  8 18:07 docker-scan -> /mnt/wsl/docker-desktop/cli-tools/usr/local/lib/docker/cli-plugins/docker-scan
be4rrbe4rr

StackOverflowの回答に従ってシンボリックリンクをすべて削除し,Dockerのインストール手順をもう一度行いました.
Install Docker Engine on Ubuntu

改めてイメージをビルドしてみると今度はDeprecated警告が出ずにビルドが完了しました.

$ docker build . -t myapp
[+] Building 0.0s (9/9) FINISHED
 => [internal] load .dockerignore                                                                    0.0s
 => => transferring context: 2B                                                                      0.0s
 ...

BuildKitが有効になっているのかどうかがはっきりとはわかりませんが,BuildKitを無効にしてビルドしてみると最初と同じ警告が現れます.

$ DOCKER_BUILDKIT=0 docker build .
DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
            BuildKit is currently disabled; enable it by removing the DOCKER_BUILDKIT=0
            environment-variable.
...

buildxも問題なさそうです.

$ docker buildx version
github.com/docker/buildx v0.10.4 c513d34
このスクラップは2023/04/20にクローズされました