docker build过程中遇到错误qemu-x86_64: Could not open '/lib64/ld-linux-x86-64.so.2': No such file or directory

发布时间 2023-08-29 19:40:45作者: tangjicheng
Removing intermediate container 70af516d5d6b
 ---> a69229847153
Step 5/6 : RUN GO111MODULE="on" go get github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb; ln -s $(go env GOPATH)/bin/jb /usr/bin/jb
 ---> Running in 13545862fffe
qemu-x86_64: Could not open '/lib64/ld-linux-x86-64.so.2': No such file or directory
qemu-x86_64: Could not open '/lib64/ld-linux-x86-64.so.2': No such file or directory
Removing intermediate container 13545862fffe

我在M1 Max MacBook Pro笔记本电脑上也遇到了同样的问题,试图从公司的仓库中进行docker构建。这应该是一个相当常见的路径,但我可能是唯一一个使用ARM64 M1 "Apple Silicon" Mac的人(我们是一个小公司)。然而,我发现对我的情况的解决方案与OP的解决方案完全相反,那就是在docker文件的FROM行中添加--platform=linux/amd64。

示例:

FROM --platform=linux/amd64 ubuntu:20.04

否则,它开始时使用的是一个ARM64镜像,而我并没有意识到这一点,但在Dockerfile的后面,构建尝试安装和执行为x86_64编译的代码。通过请求基础镜像为linux/amd64开始构建过程,然后基础镜像会有/lib64/ld-linux-x86-64.so.2。这可能意味着所有的东西都是通过qemu-x86_64在ARM64 CPU上模拟为x86_64。所以,如果你有从ARM64镜像开始的选项,并且可以在构建时在容器内编译任何你不能安装为ARM64二进制文件的软件,当你稍后在基于M1的Mac上运行容器时,它可能会运行得更快。对于这种情况,我现在还不能亲自尝试。

在Dockerfile中,FROM 指令用于指定基础镜像,也就是构建新镜像时所基于的镜像。ubuntu:20.04 是基础镜像的名称和标签。

--platform=linux/amd64 是一个可选的参数,用于指定目标平台的OS和架构。在这个上下文中,它用于确保即使在ARM64架构的机器上,也从amd64架构的Ubuntu 20.04镜像开始构建。

这个语法在Docker的某些版本中被引入,特别是在Docker开始支持多平台镜像时。这允许开发者在一个架构上为另一个架构构建镜像,例如在ARM64上为amd64构建或反之。

简而言之,FROM --platform=linux/amd64 ubuntu:20.04 这行指令告诉Docker,无论在哪个平台上构建,都要使用amd64架构的Ubuntu 20.04镜像作为基础镜像。