M1 Docker预览版和Keycloak的“镜像平台”(linux/amd64)与检测到的主机平台(linux/arm64/v8)不匹配的问题

204

我刚刚下载了 Docker 预览版 v3.1 https://docs.docker.com/docker-for-mac/apple-m1/ 并尝试运行 keycloak。

还有其他人遇到这个问题吗?

docker run -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin quay.io/keycloak/keycloak:12.0.4
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
14个回答

293

58
请确保将此内容放在docker run之后但在镜像名称之前。顺便说一下,不要改变原来的意思,使其更通俗易懂,但不要添加解释。 - Daniel Porteous
4
如果您正在M1 Mac上构建一个用于Linux的镜像,则使用--platform linux/amd64来构建适用于Intel芯片的版本。 - RonanCodes
2
如果我在 M1 Mac 上构建一个图像以在 M1 Mac 上运行,那会怎样?为什么它还是不能工作?! - RedDoumham
这可能会有警告,具体取决于您的docker系统驱动程序。我在m1上使用Colima运行它,但它使用“仿真”,所以速度很慢,有时会“挂起”。最好只使用来自https://hub.docker.com/r/sleighzy/keycloak/tags的arm64镜像。 - Jaekov Segovia
7
对于那些使用docker-compose的人,你可以在你的docker-compose.yml文件中为受影响的镜像添加"platform: linux/amd64"。 - Stetzon
显示剩余3条评论

46
将以下代码添加到您的~/.zshrc~/.bashrc文件中。这将允许您在执行docker run命令时无需重复指定标志:

export DOCKER_CLI_ARGS="--rm"
# useful only for Mac OS Silicon M1, 
# still working but useless for the other platforms
docker() {
 if [[ `uname -m` == "arm64" ]] && [[ "$1" == "run" || "$1" == "build" ]]; then
    /usr/local/bin/docker "$1" --platform linux/amd64 "${@:2}"
  else
     /usr/local/bin/docker "$@"
  fi
}

使用类似 docker() { if ...; then set "$1" --platform linux/amd64 "${@:2}"; fi; command docker "$@"; } 这样的方式可能更加清晰。 - William Pursell

31

与 @li Etzyio 的回复类似,该错误告诉您本地构建镜像所使用的平台与镜像所使用的平台不同。这在 M1 计算机(和可能其他计算机)上会发生,因此您需要在 docker build 命令中指定 --platform <PLATFORM_SPEC>,并将 <PLATFORM_SPEC> 替换为错误提示中的平台(在本例中为 linux/arm64/v8)。

还有一些对我有用的东西是设置这些环境变量:

export DOCKER_BUILDKIT=0                                                                                                                                                    
export COMPOSE_DOCKER_CLI_BUILD=0
export DOCKER_DEFAULT_PLATFORM=linux/amd64

如果您不想每次运行构建命令时都传递标志--platform,则可以这样做。


谢谢您。我刚购买了 M1 Pro,这对我在使用 Docker Compose 时有所帮助,或者更确切地说是在消耗镜像而不是构建它们方面。同时确认我正在使用 Docker Compose v2 和文件版本 v3。 - DevOverlord
这篇帖子中最佳答案,谢谢。 - Thales Valias
谢谢。仅需这一行即可:export DOCKER_DEFAULT_PLATFORM=linux/amd64。为了将其添加到一个由不同人使用的脚本中,我添加了export DOCKER_DEFAULT_PLATFORM=linux/$(uname -m) - juanesarango
你如何设置环境变量?只需要在终端中运行 export DOCKER_DEFAULT_PLATFORM=linux/amd64 吗? - Sayf
1
@Sayf 是的,只需在终端中输入或将其添加到您的shell文件中。 - Cesar Flores

23
在使用M1芯片的Mac上,您需要在Docker Desktop中启用Rosetta(设置>开发功能)。Rosetta是Mac硅芯片的动态二进制翻译器,可以将x86指令翻译成ARM指令。

enter image description here

您可以通过设置以下环境变量来指定默认的Docker构建配置(请注意 - 仅当您希望所有 Docker容器都使用此作为默认平台时才这样做):

export DOCKER_DEFAULT_PLATFORM=linux/amd64

下次运行Docker构建时,它将使用此作为图像的默认平台,并且启用了Rosetta后现在应该可以正常工作。

查看 - https://collabnix.com/warning-the-requested-images-platform-linux-amd64-does-not-match-the-detected-host-platform-linux-arm64-v8/


1
谢谢!你救了我的一天!我尝试运行Keycloak 13.0.1,但是其他方法都失败了:自己构建、使用--platform标志等等。 - donmaro

22

如果你在M1 Mac上运行Docker Workstation,你可以利用Docker Workstation多CPU架构支持,其中包括buildx命令。它允许你为不同的CPU创建镜像。

要在你的M1 Mac工作站上构建Linux/AMD/Intel镜像,请运行以下命令。

docker buildx build --platform=linux/amd64 -t myorg/mytag:1.0.0 .

docker buildx放在前面可以使用BuildKit进行命令操作。详情请参阅上述链接。

2
谢谢!这帮助我将我在M1 Mac上构建的图像部署到https://labs.play-with-docker.com/。 - Shiraz
非常好的答案;我正在M1 Mac上构建图像,并需要在Jenkins(Linux)中运行它。通过这种方式做后,Jenkins使用该图像时没有任何问题。谢谢! - mmarion
这帮助我在play-with-docker上获取了docker入门应用程序。我遇到了其他问题,构建时间非常长。最终调试出来的方法是在Dockerfile中不审计npm,即RUN npm install --production --no-audit。我还必须在命令的末尾添加标志--network="host"。docker buildx build --platform=linux/amd64 -t getting-started . --network="host" - OctaviaLo

13

5
我尝试了一下。只有在设置了 Docker 的实验性特性“使用新的虚拟化框架”(而不是 Hypervisor)后才有效(在 Big Sur 上)。 - musicformellons
传奇音乐表单。 - van

6
以下操作可在 M1 机器上构建镜像:
docker build -t <image-name> --platform linux/x86_64

5
在Docker桌面中设置“在Apple Silicon上使用Rosetta进行x86/amd64仿真”配置帮助我解决了这个问题- Docker设置链接。

你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

3

当我升级到新版本时,我也遇到了这个问题。

我通过删除旧版本构建的所有图像“docker system prune --all”并重新构建图像来解决它。


如果您在安装了一个备份所有amd64镜像的时间机器后,发现自己在这里,那么这是最简单和最好的解决方案! - Edoardo

2

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