背景
我想用PC(Windows)上的VS code连接远程服务器(Linux)内的docker容器,这样能用编辑器editor修改文件,更加方便。VS code的插件remote-container能达到这一目的,按照它的指示guide,我需要先在本地PC(Windows)安装docker desktop。
于是我在官网下载docker installer,安装一切顺利,最后重启电脑。
重启电脑后docker启动,提示需要手动安装WSL2,我点击提示中的链接顺利安装WSL2,并且在终端测试安装成功。
但是,docker却在start engine时却报错,以下是部分错误信息:
System.InvalidOperationException:
Failed to set version to docker-desktop: exit code: -1
stdout: �S��v�[a�{|�W
N/ec\Ջ�v�d\O0
stderr:
在 Docker.ApiServices.WSL2.WslShortLivedCommandResult.LogAndThrowIfUnexpectedExitCode(String prefix, ILogger log, Int32 expectedExitCode) 位置 C:\workspaces\master-merge\src\github.com\docker\pinata\win\src\Docker.ApiServices\WSL2\WslCommand.cs:行号 146
在 Docker.Engines.WSL2.WSL2Provisioning.<ProvisionAsync>d__8.MoveNext() 位置 C:\workspaces\master-merge\src\github.com\docker\pinata\win\src\Docker.Engines\WSL2\WSL2Provisioning.cs:行号 81
我Google报错信息的前两行,并没有人遇到相同的问题,于是我漫长的解决之路开始了。
先说我的原因和解决方法
最终我是因为安装完WSL2之后,没有在Microsoft Store中下载在Windows上的Linux子系统分发版本(如Ubuntu20)。我下载之后,在Docker desktop中设置选择哪个子系统,engine就能开启了。
授人以鱼不如授人以渔
斗胆用这句话引出这一部分,下面我将我的尝试按照,推荐大家遇到问题时的解决顺序安排,希望给大家一些参考,毕竟大家遇到的问题不可能完全一样,各种各样的问题都可能出现,知道如何解决才是最重要的。
1 用报错信息的主要内容去搜索
比如我的主要错误信息就是前两行,搜索引擎可以用Google(推荐)、百度。注意,要看搜索结果中是否有关键的错误信息(第二行),没有的话也不用看了,因为并不是一种错误。比较相似的可以点开看看,看能否找到自己漏掉什么。不过需要注意系统和软件版本要对应。
如果sadly没有前人的经验,那进入下一步。
2 利用docker的diagnose诊断功能
在docker desktop软件的右上方有个bug臭虫的标志,叫做troubleshoot,点击进入后点击get support。在左侧有正在自动分析的diagnose,不过推荐使用下面小蓝字的new self-diagnose tool,分析更加详细。
按照指示输入分析指令后,会得到很长的分析,通常情况下直接下拉到最下面,就是最可能的问题。
我当时的问题是not install WSL Distribution docker-desktop-data,再用这个信息Google,按照博客指示推测出了应该要下载子系统,一切解决。
3 Docker的GitHub issue
如果我最开始就用docker的自我诊断功能就早解决了,而不是花了大半个下午,我接着说我其他的方法吧。
GitHub的issue是个好地方,会找到很多相似的问题。
我在issue里搜索Windows docker desktop cannot launch after installation,打开几个看,发现它们的错误代码不完全相同,试了它们的方法也没什么用。