Windowsの新規環境でDocker環境を作ろうとしたら徹夜した話
投稿の内容
SnapdragonのWindows端末を新たに慎重して開発環境として早期アクセスになっているDockerを導入しようと作業を始めたら動くまでに深夜作業を強いられて解決した話を記述する。
経緯
Surfaceを屋外用の作業マシンとして10年ほど愛用しており、Surface bookからSurface Proを使用してきた。今回、数年越しにSurface Proを新調しようと昨年から検討をしていると、CPUがSnapdragonになっていることを知った。
MacBookのM1プロセッサなどいわゆるApple siliconが登場した際にも開発をおこなう人々は混乱の渦に巻き込まれていた。特にDockerなど仮想環境は命令セットなどの違いから動作ができないと様々な課題が出てきた。現在は、MacBookでもある程度の仕組みは動作するようになっているが、SurfaceのSnapdragonはArmアーキテクチャでまた異なるCPUの構造となっている。
それらの違いから、これまで通りのIntel搭載機を購入したいと考えていたが、Surface Proの最新はほとんどがArmベースのSnapdragonで絶望した。私の必要としていたスペックではIntel製のCPUを搭載していないため、購入を躊躇していた。
長い検討を過ごしたが、直近でDockarがArmベースのCPUで動作するようになったりと開発がある程度できる環境が整いつつあると判断したため、今回Surface Proの購入に踏み切った。
購入後、後悔はしていないが、ハードウェアの仕様の変化については慎重に検討すべきだと改めて実感した。
解決しなかった方法
よくあるような定番の解決方法を試した。当たり前だがそんなものは一切解決につながらなかった。
- Dockerの再インストール
- WSLの再インストール
- Windowsの再起動や最新化
発生していたエラー
Dockerを何度再起動していても同じエラーが発生した。それが以下だ。
bootstrapping in the main distro: deploying WSL distros: provisioning docker WSL distros: ensuring data distro is deployed: deploying "docker-desktop-data": importing WSL distro "The imported file is not a valid Linux distribution.\r\nError code: Wsl/Service/RegisterDistro/WSL_E_NOT_A_LINUX_DISTRO\r\n" output="docker-desktop-data": exit code: 4294967295: running WSL command wsl.exe C:\WINDOWS\System32\wsl.exe --import docker-desktop-data <HOME>\AppData\Local\Docker\wsl\data C:\Program Files\Docker\Docker\resources\wsl\wsl-data.tar --version 2: The imported file is not a valid Linux distribution. Error code: Wsl/Service/RegisterDistro/WSL_E_NOT_A_LINUX_DISTRO : exit status 0xffffffff
内容を確認すると、WSLに対して新たなディストロを追加する際にエラーが発生しているようだった。DockerはWindowsで初回起動を行うとWSLにて二つのディストロをインポートする。それがdocker-desktop
とdocker-desktop-data
の二つだ。WSLのディストロの一覧を確認すると、docker-desktop
は問題なく追加されているもののdocker-desktop-data
は追加されていなかった。
これは、エラー文にも記載があり、エラー主文はThe imported file is not a valid Linux distribution.
であり、無効なディストロとのことだった。なにがどう無効か全くわからないが、WSLの再インストールやDockerの再インストールを繰り返したのは言うまでもない。
ちなみに、エラー文には丁寧に実行したコマンドが記述されていたため、すこし書き換えてPowerShellにて実行したが、やはりDockerと同様のエラーが表示された。実行される状況には差がなく、単純にDockerとWSLとの組み合わせだと気づいた時には、12時を超えていた。
C:\WINDOWS\System32\wsl.exe --import docker-desktop-data \AppData\Local\Docker\wsl\data "C:\Program Files\Docker\Docker\resources\wsl\wsl-data.tar" --version 2
解決
同様のエラーはこの記事の2週間前に、すでにGitHubのIssuesに起票されていた。
一つ目のコメントには早速Snapdragonである方のコメントがあるが、今回のエラーは、Snapdragonそのものの影響はない。
コメントを読み進めると、WSLのダウングレードにより解決した旨が記述されていた。
今回のエラーが発生してた私の環境は以下の通りだ。
- | バージョン |
---|---|
Windows 11 home | 24H2(26100.4061) |
WSL | v2.5.7 |
Docker | v4.42.0 |
上記のIssueのダウングレードでは、WSLの2.4系の最新で問題なく動作すると書かれていたため、WSLのみダウングレードを試みたが、しっかりと案内されているような記事が見つからず悩んだが、意外と簡単に完了した。
WSLをアンインストール
$ wsl --uninstall
GitHubのWSLリポジトリのリリース一覧から今回は2.4.13
のAssetsからwsl.2.4.13.0.arm64.msi
をダウンロードしインストーラーから取り込んだ。
過去のバージョンをインストールすることで、Dockerを再起動すると、問題なく起動した。コンテナ起動も通常通り動作した。
いろいろと調べると、WSL側の設定だのdocker-usersのグループ設定だの、管理者としてターミナルを実行するなど、直接的に関与しない記事も多く、惑わされ、時間を要してしまったのは少し悲しかった。
終わりに
新たな端末を購入し、新しく開発環境を整えるのは毎回わくわくする。
Snapdragonの購入を様子見していたのも悪くなかったと自負しており、今回購入したタイミングは悪くなかったかもしれない。ある程度の開発環境が整いつつあるため、自己責任だがArmベースCPU搭載の端末の購入も選択肢の一つに入れてもいいかもしれない。
Discussion