qemu-x86_64:无法打开“/lib64/ld-linux-x86-64.so.2”:没有这样的文件或目录

sem*_*ral 117 go docker rancher apple-m1

我在 M1 MacOS 上有一个 Rancher Deskop(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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

slo*_*oni 228

顺便说一句,如果这对另一个来到这里的人有帮助,我在一台 M1 Max MacBook Pro 笔记本电脑上遇到了同样的问题,试图docker build从公司仓库中进行操作,这应该是一条非常好的路径,但我可能是唯一的一个(它是一家小公司)拥有 ARM64 M1“Apple Silicon”Mac。然而我发现我的情况的解决方案(好吧,一个解决方案)与OP的解决方案完全相反,那就是添加 --platform=linux/amd64 到docker文件的FROM行。

例子:

FROM --platform=linux/amd64 ubuntu:20.04
Run Code Online (Sandbox Code Playgroud)

否则,它会从 ARM64 映像开始,而我并不知道,但后来在 Dockerfile 中,构建尝试安装并执行为 x86_64 编译的代码。通过请求基础映像开始构建过程,linux/amd64然后基础映像具有/lib64/ld-linux-x86-64.so.2. 这可能意味着所有内容都在 ARM64 CPU 上被模拟为 x86_64 qemu-x86_64,因此,如果您可以选择从 ARM64 映像启动,并且可以在构建期间在容器内编译任何您无法安装为 ARM64 二进制文件的软件,那么它将当您稍后在基于 M1 的 Mac 上运行容器时,速度可能会更快。对于这种情况,我自己还无法尝试。

  • 完全相同的问题,通过“docker run”添加“--platform linux/amd64”解决了它。我正在安装arm64 go,但它无法运行。谢谢。 (12认同)
  • 如果您使用 docker-compose,则可以将 `services.service_name.platform` 设置为 `"linux/amd64"`。摘自/sf/ask/4790401101/ (9认同)
  • 谢谢。这种格式有效:`FROM --platform=linux/amd64 ubuntu:20.04 as image_name` (5认同)

Cur*_*Sam 28

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

export DOCKER_DEFAULT_PLATFORM=linux/amd64
Run Code Online (Sandbox Code Playgroud)

原因似乎在于 AArch64 映像中。


rsy*_*rsy 10

我更喜欢将平台作为参数传递给命令,而不是按照此答案中的建议编辑 Dockerfile ,或者按照此答案中的建议设置环境变量。OP 使用的命令将是:docker build--platform

docker build --platform linux/amd64 -t te-grafana-dashboards-toolchain --no-cache .
Run Code Online (Sandbox Code Playgroud)


sem*_*ral 1

这解决了我的问题。

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
Run Code Online (Sandbox Code Playgroud)

  • 仅修改了第一行(删除了 --platform=linux/amd64 )。 (4认同)