qemu-x86_64: 无法打开 '/lib64/ld-linux-x86-64.so.2':找不到文件或目录

109
我在M1 MacOS上运行Rancher Desktop(dockerd),当我尝试构建下面的Dockerfile时,会遇到以下错误。这是我尝试构建映像的命令:docker build -t te-grafana-dashboards-toolchain --no-cache . 我尝试更改平台,但没有一种适用于我的情况。对于M1的平台问题,我有点迷失,但任何帮助都将不胜感激。我做错了什么?这可能是什么根本原因?
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

Dockerfile

FROM --platform=linux/amd64 ubuntu:focal
RUN apt update; apt install -y curl jq build-essential python3.8 python3-pip docker-compose jsonnet bison mercurial
RUN ln -s /usr/bin/python3.8 /usr/bin/python
RUN curl -OL https://golang.org/dl/go1.17.linux-amd64.tar.gz; mkdir /etc/golang; tar -xvzf go1.17.linux-amd64.tar.gz -C /etc/golang; ln -s /etc/golang/go/bin/go /usr/bin/go; rm -f go1.17.linux-amd64.tar.gz
RUN GO111MODULE="on" go get github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb; ln -s $(go env GOPATH)/bin/jb /usr/bin/jb
WORKDIR /workspace
7个回答

200

顺便提一下,如果有其他人遇到同样的问题,我在M1 Max MacBook Pro笔记本上尝试从公司仓库进行docker build时也遇到了同样的问题,这应该是一个经过深思熟虑的路径,但可能只有我(公司规模较小)使用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上运行容器时,速度可能会更快。对于这种情况,我目前还无法自行尝试。

11
完全相同的问题,使用docker run并添加--platform linux/amd64解决了它。我正在安装arm64 go,但无法运行。谢谢。 - Pablo LION
9
如果你使用docker-compose,你可以将 services.service_name.platform 设置为 "linux/amd64"。取自 https://dev59.com/EcHqa4cB1Zd3GeqP0Xh5 - Ben Butterworth
@BenButterworth,docker-compose文件上的设置很好用!谢谢! - Diogo Alves
5
谢谢。以下是翻译的文本:FROM --platform=linux/amd64 ubuntu:20.04 as image_name。 - komodovaran_
请注意,你也可以在 docker 命令中使用相同的参数来指定目标平台,以构建多平台镜像。例如:docker build --platform=linux/amd64 (来源)。 - stevec
显示剩余5条评论

24

修改 Dockerfile 似乎是最流行的答案,但您还可以将 DOCKER_DEFAULT_PLATFORM 环境变量设置为 linux/amd64

export DOCKER_DEFAULT_PLATFORM=linux/amd64

问题似乎在AArch64镜像中。


这是我的首选,但是当设置了这个变量(在主机系统上),docker run就找不到我的任何镜像了。有解决办法吗? - tef2128

10

不像这个答案中建议的那样编辑Dockerfile,也不像这个答案中所建议的设置环境变量,我更喜欢将平台作为参数传递给docker build命令,使用--platform标志。OP使用的命令如下:

docker build --platform linux/amd64 -t te-grafana-dashboards-toolchain --no-cache .

4

如果基础镜像包含目标架构,那么在您的情况下可能有效的另一个选项是使用 Docker 内置的 TARGETARCH 构建参数。这对我在 macOS M1 上有效。

FROM ubuntu:focal
ARG TARGETARCH
RUN apt update; apt install -y curl jq build-essential python3.8 python3-pip docker-compose jsonnet bison mercurial
RUN ln -s /usr/bin/python3.8 /usr/bin/python
RUN curl -OL https://golang.org/dl/go1.17.linux-${TARGETARCH}.tar.gz; mkdir /etc/golang; tar -xvzf go1.17.linux-${TARGETARCH}.tar.gz -C /etc/golang; ln -s /etc/golang/go/bin/go /usr/bin/go; rm -f go1.17.linux-${TARGETARCH}.tar.gz
RUN GO111MODULE="on" go get github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb; ln -s $(go env GOPATH)/bin/jb /usr/bin/jb
WORKDIR /workspace

这应该是尝试的第一种方法。大多数其他答案依赖于x86仿真,这会带来性能开销和潜在的错误。 在我的情况下,这个方法完美地工作。 - Choznerol
这个解决方案非常棒,因为它可以在多个环境中轻松使用,而无需知道目标架构是否需要为某些(或全部)依赖项指定。现在每个人的构建步骤都是相同的。 - undefined

2
将以下标志作为CPPFLAGS传递给C预处理器,可以解决我在M1上遇到的类似问题。
-DPNG_ARM_NEON_OPT=0

将值作为键为CPPFLAGS的环境变量传递给相关服务。


需要的 docker run 标志是 -e CPPFLAGS=-DPNG_ARM_NEON_OPT=0。如果没有它,我会得到以下错误:npm ERR! code 1 npm ERR! path /build/explorer/node_modules/optipng-bin npm ERR! command failed npm ERR! command sh -c node lib/install.js npm ERR! compiling from source npm ERR! Command failed: /build/explorer/node_modules/optipng-bin/vendor/optipng --version npm ERR! qemu-x86_64: Could not open '/lib64/ld-linux-x86-64.so.2': No such file or directory npm ERR! npm ERR! npm ERR! optipng pre-build test failed npm ERR! Error: Command failed: /bin/sh -c make install - Hannes

2
这解决了我的问题。
FROM ubuntu:focal
RUN apt update; apt install -y curl jq build-essential python3.8 python3-pip docker-compose jsonnet bison mercurial
RUN ln -s /usr/bin/python3.8 /usr/bin/python
RUN curl -OL https://golang.org/dl/go1.17.linux-arm64.tar.gz; mkdir /etc/golang; tar -xvzf go1.17.linux-arm64.tar.gz -C /etc/golang; ln -s /etc/golang/go/bin/go /usr/bin/go; rm -f go1.17.linux-arm64.tar.gz
RUN GO111MODULE="on" go get github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb@latest; ln -s /root/go/bin/jb /usr/bin/jb
WORKDIR /workspace

4
只有第一行被修改了(去掉了--platform=linux/amd64)。 - Adrien Pacifico
如果我删除 --platform=linux/amd64 标志,就会出现这个错误,而当我重新加上它时,错误就消失了。 - demisx

1
我有一台Mac M1 Max电脑,在Kubernetes集群上运行的KIND节点上尝试使用Helm安装Camunda Platform 8时遇到了错误。 错误发生在Camunda Operate pod中。 然而,在使用'--platform linux/amd64'选项更改默认镜像后,我成功启动了容器。
具体来说,我运行了以下命令:
docker pull camunda/operate:8.1.6 --platform linux/amd64
kind load docker-image --name camunda-platform-local camunda/operate:8.1.6

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