在 M1 ARM64 映像上找不到 Linux 映像上使用的库

rez*_*adi 2 docker arm64 .net-core macos-big-sur

我想在 Visual Studio 的帮助下在 big sur (M1 芯片)中创建 Docker 映像,但出现以下错误:

Starting: "docker" exec -i 737ff06a8ab3 /bin/sh -c "ID=.; if [ -e /etc/os-release ]; then . /etc/os-release; fi; if [ $ID = alpine ] && [ -e /remote_debugger/linux-musl-x64/vsdbg ]; then VSDBGPATH=/remote_debugger/linux-musl-x64; else VSDBGPATH=/remote_debugger; fi; $VSDBGPATH/vsdbg --interpreter=vscode --interpreter=vscode"
Error from pipe program 'docker': qemu-x86_64: Could not open '/lib64/ld-linux-x86-64.so.2': No such file or directory
Run Code Online (Sandbox Code Playgroud)

第一次可以正常,但是第二次就出错了

如何解决

Rob*_*sey 7

当我的 Dockerfile 指定了通用映像名称但安装了 linux/amd64 软件时,我遇到了这个问题。在此实例中发生的情况是,您将获得一个 ARM64 (M1) 基础映像(除非您在构建调用中指定不同的 --platform),该映像不会预先填充 x86 共享对象。

它将忠实地尝试通过 Docker 的 qemu 虚拟机管理程序运行 x86 (amd64) 代码,但发现它缺少一些必须特定于体系结构的基本共享对象。

这意味着您需要调用操作系统包管理器并安装 x86 共享对象包并确保它们位于您的 LD_LIBRARY_PATH 中。您看到的错误消息将告诉您需要查找什么。

就我而言,使用基于 ubuntu/debian 的 arm64 映像,我使用“apt”包管理器。在其他操作系统中,您可能会使用“yum”或“rpm”。访问该操作系统的网站(例如packages.debian.org)并在其包中搜索您的库依赖项,然后在您的RUN 调用中指定该依赖项以构建到映像中。

对于您的错误,您可能正在寻找“libc6”。我是这样加载的,这是一个amd64交叉编译包:

Dockerfile 条目示例:

RUN apt-get update
RUN apt-get install -y wget unzip
RUN apt-get install -y libc6-amd64-cross

RUN ln -s /usr/x86_64-linux-gnu/lib64/ /lib64

ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/lib64:/usr/x86_64-linux-gnu/lib"
Run Code Online (Sandbox Code Playgroud)

您可能发现缺少其他库,因此您只需单步执行它并解决缺少的共享对象即可。