Docker: "清单列表条目中没有适用于Windows/amd64的匹配清单"

324

我在 Windows 上使用 Docker,当我尝试使用以下命令拉取 PHP 镜像时

$ docker pull php

我收到了这条消息:

Using default tag: latest
latest: Pulling from library/php no matching manifest for windows/amd64 
        in the manifest list entries

我该如何解决这个问题?


17
为了帮助他人,我在创建基于Linux的操作系统镜像时遇到了错误……造成这个错误的原因是它被设置为Windows容器,所以我切换到Linux容器后,它就开始正常工作了。 - Abhishek Jain
3
为了记录:我是通过构建 Windows 容器来获得这个问题的。尽管我已经切换到了 Windows,但它似乎又回到了 Linux。将它改回为 Windows 可以解决这个问题。 - John MacIntyre
25个回答

381
我在Windows 10(2020年)和Windows 11(2023年)上遇到了同样的问题。 我通过在实验模式下运行Docker守护程序来绕过此问题:
  1. 在Windows系统托盘中右键单击Docker图标
  2. 进入设置
  3. 选择Docker Engine
  4. 编辑Docker守护程序文件
  5. "experimental": true设置为true
  6. 点击应用并重新启动Docker

10
在Windows系统上,您可以直接在路径'%programdata%\docker\config\daemon.json'中找到配置文件并设置属性。 - NemyaNation
5
这对我有用,我只是想知道为什么会有效?实验的目的是什么? - Nic Parmee
4
如果您正在使用独立二进制文件运行 docked(守护程序),请使用“--experimental”功能。 - Anwar
2
将 "experimental": true 设置为真会有任何安全问题吗?操作完成后我需要恢复吗? - kudlatiger
2
那么正在进行什么实验 - Lei Yang
显示剩余3条评论

334

这个错误可能有很多原因。但最常见的原因是在Linux容器模式下使用Windows容器,或反之亦然。

  1. 点击系统托盘中的Docker图标,在上下文菜单中选择
  2. 点击“切换到Window/Linux Container”
  3. 在切换对话框中选中选项并点击切换按钮
  4. 这可能需要一点时间
  5. 确保现在Docker处于运行状态

切换容器模式对话框


19
它解决了我的关于“没有与 windows/amd64 匹配的清单”的问题。 - winlinux
2
它对我起作用了,解决了“清单列表条目中没有与Windows/amd64 10.0.17134匹配的清单”的问题。 - Amna
3
这个答案与 Windows 容器无关,只适用于 Linux 容器。请参考 @benscabbia 的答案。 - junnyea
2
如果您找不到系统托盘图标,可以在 PowerShell 中使用以下命令:& $Env:ProgramFiles\Docker\Docker\DockerCli.exe -SwitchDaemon .请参阅以下链接:https://learn.microsoft.com/en-us/virtualization/windowscontainers/quick-start/set-up-environment?tabs=dockerce - aviggiano
1
谢谢!我试图从“node”镜像运行Windows容器,但显然没有Windows版本的“node”镜像。这个答案帮助了我更进一步:https://dev59.com/UVUL5IYBdhLWcg3w4raQ#72583505 - tolache
显示剩余2条评论

109

您处于Windows容器模式。因此,如果您不确定要拉取的镜像是否为Windows架构构建,则需要切换到Linux容器。


1
另一种可行的方法(我也发现它可以工作)在chuck的答案中。 - Peter Mortensen
一旦它无法切换,那就是一个解决方法。 - Tiago Medici
1
如果您切换到Linux容器,那么是否可以在Docker中托管Windows应用程序?例如,在同一Docker实例上使用IIS和MySQL。 - webworm
@Webworm,既然Windows也有MySQL,为什么要使用Linux版本,而不是直接使用其Windows版本,以便与IIS混合使用呢? - George Birbilis

75

在我的情况下,问题是我使用的Windows操作系统版本不支持我尝试获取的标签。使用较旧的标签使我成功了。

具体来说:

docker pull mcr.microsoft.com/windows/nanoserver:1903 出现错误

docker pull mcr.microsoft.com/windows/nanoserver:1803-amd64 成功了


2
这个!与旧的镜像(servercore/nanoserver)相比,微软进行了一些更改。现在,您需要查找要部署到的系统的Windows版本,并相应地选择基础映像。 - JustCoding
1
好答案!在我按照这个教程 https://learn.microsoft.com/en-us/virtualization/windowscontainers/quick-start/run-your-first-container 在 Windows 10 上运行成功了。 - user1299379
它对我也起作用了。但这是否意味着我在拉取每个镜像时,例如hello-world,都需要采用这种方法? - Mandroid
@Mandroid,我对你的研究结果感兴趣,但在我的情况下,有些图片似乎能用,有些则不能,因此我想这可能与设置密切相关。例如,如果你有一个Windows补丁,可能与另一个不同。 - joedragons
请使用 winver 确保您的主机机器上的 Windows 版本是新于或等于映像中的版本。 - cowlinator
为了在Windows 10上拉取Windows服务器,我不得不回到最早的标签:win10-21h1-preview。 - dudeNumber4

63

版本: Windows 10

步骤1: 右键单击Docker实例并进入设置
输入图像描述

步骤2: 从基本设置到高级设置,然后将 "experimental": true 设为true 输入图像描述

步骤3: 重启Docker
输入图像描述

步骤4: 安装dockerfile成功(例如: docker build -t williehao/cheers2019 . ) 输入图像描述


39

另一种可能的方法是:

在系统托盘中,右键单击 Docker 图标,然后单击 切换到 Linux 容器

(Docker for Windows,Community Edition,版本18.03.1)


23

我在Windows 10中通过以管理员身份运行Powershell解决了这个问题:

cd "C:\Program Files\Docker\Docker"

然后:

./DockerCli.exe -SwitchDaemon

这也可以通过右键单击 Docker 桌面图标,并根据需要选择“切换到 Windows 容器”/“切换到 Linux 容器”来完成。请注意:如果您安装的 Windows 映像版本高于主机版本的 Windows,则仍会遇到问题(例如,请参见操作系统版本列:https://hub.docker.com/_/microsoft-windows)。 - JohnLBevan

17

Windows 10 20H2 更新

  1. 进入 Docker 配置
  2. 进入 Docker Engine 选项卡
  3. "experimental": false 更改为 "experimental": true
  4. 使用 应用并重新启动 按钮重启 Docker

enter image description here


您也可以手动修改配置文件,使用您喜欢的代码编辑器(例如 Visual Code、Notepad++ 等),例如:

# BACKUP Your file with PowerShell
Copy-Item -Path C:\ProgramData\Docker\config\daemon.json -Destination C:\ProgramData\Docker\config\daemon.json.backup

# Open the file with Visual Code
code C:\ProgramData\Docker\config\daemon.json

或者直接使用 Powershell 直接更改字符串。

# Set Path in variable
$FILE = "C:\ProgramData\Docker\config\daemon.json"

# Replace '"experimental": false' to '"experimental": true'
(Get-Content -Path $FILE) -replace '"experimental": false','"experimental": true' | Set-Content -Path $FILE

# Check the file content
type $FILE

输出示例

PS C:\WINDOWS\system32> type $FILE
{
  "registry-mirrors": [],
  "insecure-registries": [],
  "debug": false,
  "experimental": true
}

在你需要的时候重新启动Docker守护进程

PS C:\WINDOWS\system32> Restart-Service docker

检查服务的状态

PS C:\WINDOWS\system32> Get-Service docker
Status   Name               DisplayName
------   ----               -----------
Running  docker             Docker Engine

14

是的,--platform 标志也可以使用。不过这可能会重新下载一些内容。 - Peter Mortensen
“--platform” 仅在启用实验特性的 Docker 守护程序上受支持。 - Michal Špondr

9
在Docker中:
  1. 进入设置
  2. 进入Docker Engine
  3. experimental更改为true
  4. 点击应用并重启

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接