Rust musl Docker 镜像找不到 Cargo

2024-03-04

我正在尝试让 Rust 在 Docker 中运行,以将其用于 32 位 musl 构建。自从我更新它以使用新的 URL 来拉 rustup 后,我在使用 bash 交互运行容器时遇到了这个问题:

root@2c3549fe3169:/sample# cargo
error: command failed: 'cargo'
info: caused by: No such file or directory (os error 2)

奇怪的是,我可以看到可执行文件

root@2c3549fe3169:/sample# ls -l /root/.cargo/bin/
total 101440
-rwxr-xr-x 10 root root 10383380 Feb 17 21:34 cargo
-rwxr-xr-x 10 root root 10383380 Feb 17 21:34 cargo-clippy
-rwxr-xr-x 10 root root 10383380 Feb 17 21:34 cargo-fmt
-rwxr-xr-x 10 root root 10383380 Feb 17 21:34 rls
-rwxr-xr-x 10 root root 10383380 Feb 17 21:34 rust-gdb
-rwxr-xr-x 10 root root 10383380 Feb 17 21:34 rust-lldb
-rwxr-xr-x 10 root root 10383380 Feb 17 21:34 rustc
-rwxr-xr-x 10 root root 10383380 Feb 17 21:34 rustdoc
-rwxr-xr-x 10 root root 10383380 Feb 17 21:34 rustfmt
-rwxr-xr-x 10 root root 10383380 Feb 17 21:34 rustup
root@2c3549fe3169:/sample# date
Sun Feb 17 21:34:21 UTC 2019
root@2c3549fe3169:/sample# file /root/.cargo/bin/cargo
/root/.cargo/bin/cargo: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.9, with debug_info, not stripped
root@2c3549fe3169:/sample# cargo
error: command failed: 'cargo'
info: caused by: No such file or directory (os error 2)

它是通过以下方式安装的:

RUN curl https://sh.rustup.rs -sSf | sh -s -- \
--default-toolchain 1.32.0 \
-y && \
~/.cargo/bin/rustup target add i686-unknown-linux-musl && \
echo "[build]\ntarget = \"i686-unknown-linux-musl\"" > ~/.cargo/config

我可以看到该文件,但似乎无法运行它,即使我切换到该目录:

root@2c3549fe3169:~/.cargo/bin# ./cargo
error: command failed: 'cargo'
info: caused by: No such file or directory (os error 2)

这是我跑步时看到的ldd:

root@4e21c8d37266:/volume# ldd /root/.cargo/bin/cargo
linux-gate.so.1 (0xf7f41000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf774c000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xf7742000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf7723000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf7705000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7529000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7427000)
/lib/ld-linux.so.2 (0xf7f43000)

这是我完整的 Dockerfile

FROM i386/ubuntu

RUN apt-get update && apt-get install -y \
  cmake \
  curl \
  file \
  git \
  g++ \
  python \
  make \
  nano \
  ca-certificates \
  xz-utils \
  musl-tools \
  pkg-config \
  apt-file \
  xutils-dev \
  --no-install-recommends && \
  rm -rf /var/lib/apt/lists/*


RUN curl https://sh.rustup.rs -sSf | sh -s -- \
  --default-toolchain 1.32.0 \
  -y && \
  ~/.cargo/bin/rustup target add i686-unknown-linux-musl && \
  echo "[build]\ntarget = \"i686-unknown-linux-musl\"" > ~/.cargo/config


# Compile C libraries with musl-gcc
ENV SSL_VER=1.0.2j \
    CURL_VER=7.52.1 \
    CC=musl-gcc \
    PREFIX=/usr/local \
    PATH=/usr/local/bin:$PATH \
    PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

RUN curl -sL http://www.openssl.org/source/openssl-$SSL_VER.tar.gz | tar xz && \
    cd openssl-$SSL_VER && \
    ./Configure no-shared --prefix=$PREFIX --openssldir=$PREFIX/ssl no-zlib -m32 linux-elf -fPIC -fno-stack-protector && \
    make depend 2> /dev/null && make -j$(nproc) && make install && \
    cd .. && rm -rf openssl-$SSL_VER

RUN curl https://curl.haxx.se/download/curl-$CURL_VER.tar.gz | tar xz && \
    cd curl-$CURL_VER && \
    ./configure --enable-shared=no --enable-static=ssl --enable-optimize --prefix=$PREFIX --host=i686-pc-linux-gnu CFLAGS=-m32 \
      --with-ca-path=/etc/ssl/certs/ --with-ca-bundle=/etc/ssl/certs/ca-certificates.crt --without-ca-fallback && \
    make -j$(nproc) && make install && \
    cd .. && rm -rf curl-$CURL_VER

ENV SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt \
    SSL_CERT_DIR=/etc/ssl/certs \
    OPENSSL_LIB_DIR=$PREFIX/lib \
    OPENSSL_INCLUDE_DIR=$PREFIX/include \
    OPENSSL_DIR=$PREFIX \
    OPENSSL_STATIC=1 \
    PATH=/usr/local/bin:/root/.cargo/bin:$PATH

RUN echo $PATH

并追踪cargo根据评论二进制:

root@156da6108ff8:~/.cargo/bin# strace -f -e trace=execve cargo               
execve("/root/.cargo/bin/cargo", ["cargo"], 0xfffdd8fc /* 20 vars */) = 0
execve("/root/.rustup/toolchains/1.32.0-x86_64-unknown-linux-gnu/bin/cargo", ["/root/.rustup/toolchains/1.32.0-"...], 0x57d95620 /* 25 vars */) = -1 ENOENT (No such file or directory)
error: command failed: 'cargo'
info: caused by: No such file or directory (os error 2)
+++ exited with 1 +++

因此,这是我们调查的摘要。

用于构建的基础镜像是i386/ubuntu然而,在 32 位环境中,该图像没有任何作用来适当地掩盖结果uname(2)调用(通过类似的东西setarch linux32作为入口点),因此,当在 64 位系统(您的情况)上运行时,构建容器内的任何进程都会调用uname(2) or uname(1) sees x86_64代替i686。这就是问题的根源。

当你安装时cargo,您下载并运行安装脚本,该脚本会检测其运行的平台并下载适当的版本rustup-init。该脚本中的平台检测正确识别出它在 32 位环境中运行,但在 64 位内核上运行,因此该脚本下载 32 位版本rustup-init。然而,rustup-init决定它继续运行x86_64(可能它看到x86_64由返回uname(2),但不会像安装程序脚本那样执行“64 位内核上的 32 位环境”情况的检查)。安装的时候就可以看到,不用-y:

Current installation options:

    default host triple: x86_64-unknown-linux-gnu
    default toolchain: stable
    modify PATH variable: yes

So, rustup安装64位工具链,调用时会遇到这样的情况cargo运行结果32 位环境中的 64 位二进制文​​件,所以您会看到错误。

我仍然觉得这里有某种不一致的行为,因为安装脚本和rustup-init are 同一项目的部分 https://github.com/rust-lang/rustup.rs我真的不明白为什么他们应该检测该平台不同地在相同的环境中(为什么不能rustup-init就像安装脚本一样智能?)。

正如@Shepmaster 注意到的,这是一个已知问题(Rustup 在 32 位 Docker 实例上安装 64 位编译器 https://github.com/rust-lang/rustup.rs/issues/1282)。有两种可能的解决方法:

  • 通过传递强制平台使用默认工具链--default-host i686-unknown-linux-gnu给安装人员;
  • 通过在下面运行来欺骗安装程序setarch linux32这样它就可以调用uname(2)等着瞧i686代替x86_64.

就我个人而言,我会选择第一个选项,因为它似乎不那么麻烦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust musl Docker 镜像找不到 Cargo 的相关文章

  • D 中的多线程与 for 循环

    我知道 Rust 可以使用轻量级线程运行循环 就像是 use task spawn fn main for 100 times do spawn io println Hello 我怎样才能在D中做到这一点 相关API文档 标准并行度 ht
  • 无法从 docker 容器打开 URL

    我在从 Docker 容器导航到 Google 身份验证页面时遇到问题 该应用程序是使用 asp net Core 2 0 制作的 其目的是显示从 Google Calendar API 检索的即将发生的事件 并在需要时创建事件 当应用程序
  • 是否有可能构建一个可以通过浏览器运行的网络自动化?

    我创建了一个 Java 程序 它使用镀铬驱动程序 https chromedriver chromium org Selenium https www seleniumhq org and Java Excel API http jexce
  • 是否可以在纯 Rust 宏中编写像“print!”这样复杂的东西?

    我开始学习 Rust 宏 但文档有些有限 这很好 我想它们是一个专家功能 虽然我可以进行基本的代码生成 特征的实现等 但一些内置宏似乎远远超出了这些 例如各种打印宏 它们检查字符串文字并将其用于代码扩展 我在看的来源print https
  • 何时使用 Box> 或 Vec>?

    什么时候设计一个嵌套的数据结构才有意义 Box and a Vec 或相反亦然 似乎在大多数情况下 您想在堆上存储多个固定大小的东西 Box是多余的 因为它唯一的 作用是堆分配一个 单个值 以及一个正常的Vec已经在堆上分配其存储空间 背景
  • 启动 docker 容器时向主机 /etc/hosts 文件添加条目

    我希望能够将主机名添加到映射到 docker 容器的笔记本电脑 etc hosts 中 由于容器 ip 不是静态的 因此我启动 重新启动容器的每个站点都需要手动更新 etc hosts 文件 这不太实用 我正在寻找一种简单的方法来解决这个问
  • 如何在 App Engine 中灵活更改 /dev/shm 的大小

    如何更改共享内存文件夹的大小 dev shm在 App Engine 灵活应用程序中 默认情况下 它设置为 64M 太低 无法运行许多应用程序 例如 Chrome 我看不出有什么办法可以改变它 如果您有权访问 可以通过多种方法进行更改doc
  • Mac上使用docker安装gitlab的权限问题

    我正在尝试让 Gitlab 在本地运行 但遇到了权限问题 cp cannot create regular file etc gitlab gitlab rb Permission denied 我正在运行的命令是 sudo docker
  • 在azure应用程序服务中使用docker-compose

    我的平均堆栈代码在 docker compose 配置中工作 如果我跑docker compose up在我的电脑上 然后我可以成功登录我的应用程序localhost如果转到应用程序服务并单击 docker compose 预览选项并上传我
  • vscode 在哪里使用 lldb 可执行文件?

    我在 vscode 中调试 rust 时遇到困难 它无法评估任何涉及函数的表达式 我注意到我没有安装 lldb Ubuntu 20 04 但调试器仍在运行 在哪里可以找到 lldb 可执行文件 我可以改变路径吗 None
  • 如何在不重建镜像的情况下更新源代码

    我在 GitLab 上创建了一个新的存储库 在其中为我的 Angular 项目构建了一个 docker 镜像 现在我在本地对源代码做了一些修改 有没有办法可以更新 docker 映像而不重建它 None
  • 实现特征时“预期类型参数,找到结构”

    我正在尝试为有向图结构创建一个特征并提供一个非常基本的实现 但遇到编译器错误 pub trait DiGraph lt a gt type N fn nodes
  • 如何查看 docker build“RUN 命令”标准输出? (适用于 Windows 的 Docker)

    过去我可以简单地做这样的事情 Dockerfile FROM ubuntu RUN echo test 这会输出test到我的壳 我用它作为调试我的构建的一种方式 在 Windows 版 docker 的最新稳定版本中 构建输出看起来完全不
  • 如何接受同一个 Serde 字段的多个反序列化名称?

    我正在尝试使用 Serde 反序列化 JSON serde json 和 XML serde xml rs 基于以下结构的文件 use serde derive Deserialize derive Debug Clone PartialE
  • 使用 Fig 时,为什么我的卷有时无法安装到 Docker 容器中?

    我在 Docker Fig 环境中看到一个奇怪的问题 我的假设是 这是由于将卷安装到容器的延迟造成的 但我不确定如何确认这一点 我有一个包含以下内容的容器 Dockerfile FROM busybox MAINTAINER Dan Rum
  • 运行命令后存在来自 rocker/r-ver:4.0.4 的容器

    这是我的 Dockerfile FROM rocker r ver 4 0 4 在 cmd 中我构建 docker build t myfolder myimage 它塑造的形象很好 然后我跑 docker run myfolder myi
  • mysql_upgrade 失败 - innodb 表不存在?

    我正在将 mysql 5 5 docker 容器数据库升级到 mysql 5 6 docker 容器 我能够解决所有其他问题 最后我的服务器运行的是 5 6 但是当我运行 mysql upgrade 时出现以下错误 ERROR root 1
  • 如何更新我的 docker 服务/堆栈使用的最新映像?

    In the yml定义 我总是拉latest我的服务形象 当我将新映像推送到注册表并且想要更新堆栈中的服务使用的映像时 我没有看到任何 pull标志和文档码头服务更新 https docs docker com engine refere
  • 如何在 Docker for Windows 中设置共享驱动器?

    如何在 Docker for Windows 中设置共享驱动器 我正在使用最新版本 18 Stable 和 Edge 我的设置屏幕如下所示 它缺少一些选项 如共享驱动器 高级和网络 如第二张图片所示 为什么我缺少这些选项 My settin
  • docker 容器中的 nmcli

    我目前正在寻找在 docker 容器中运行 nmcli nmcli 在我的主机上工作得很好 但如果我启动一个特权容器 nmcli 就不起作用 启动我的容器 sudo docker run privileged net host it ima

随机推荐

  • 我可以使用 HTML 输入类型“日期”仅收集年份吗?

    我有一个字段需要从用户那里收集年份 即具有年份分辨率的日期 为了便于存储 我更愿意存储实际的日期值而不是数字 我想使用现代浏览器支持的日期输入 UI 或webshims https afarkas github io webshim dem
  • 删除分组 UITableView 中的角阴影/偏移

    当 UITableViewStyleGrouped 类型的 UITableView 的背景视图是 iPad 上的非默认颜色或图案图像时 圆角会有一条丑陋的额外线条 有点像斜角效果或投影 有谁知道有什么方法可以消除表格底部的多余线条吗 iPa
  • 在新窗口中打开 html 链接,没有浏览器工具栏

    我知道我可以使用 target blank 在新窗口中打开 html 链接 但是 如何隐藏 禁用所有浏览器工具栏 你应该使用window open url to open window name toolbar no
  • 最好的java jabber客户端库[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 您对 java jabber 库有哪些好的 坏的经历 我有过非常好的经验Smack http www igniterealtime org pr
  • Ruby 是如何实现完全面向对象的?

    所以 我很好奇 Ruby 为什么是一种完全面向对象的语言 我偶然发现了一个我不太清楚的问题 如果我定义一个函数如下 def foo text print text end 我在类之外定义了该函数 那么该函数如何成为对象 我意识到我可以打电话
  • 了解基本的 SQL 查询

    我有一个查询 例如 SELECT tran number FROM table a WHERE customer id IN SELECT customer id FROM table b WHERE customer key 89564
  • 将对象添加到现有对象数组 - JavaScript

    我创建了一个包含 2 个对象的数组 我希望编写一个 添加 函数来动态地将更多人添加到该数组中 您能解释一下为什么下面的 add 函数没有成功地将对象添加到 contacts 数组中吗 var bob firstName Bob lastNa
  • 如何使用 Meteor 执行常见的 FB 操作?

    使用 Meteor 执行常见 Facebook 操作需要执行哪些步骤accounts facebook包裹 我正在尝试获取好友列表 在墙上发布并最终执行其他操作 但我不确定如何继续 更新 对meteor 0 6 0略有修改 您需要使用 AP
  • 来自 Pandas 混淆矩阵的散景热图

    熊猫怎么能DataFrame显示为散景热图 https docs bokeh org en latest docs user guide categorical html heat maps https docs bokeh org en
  • 具有自定义视图和图像视图的 MKAnnotationView

    在我的地图应用程序中 我想显示一个带有图像的彩色背景圆圈 而不是显示图钉 背景圆圈的颜色 下图中的绿色阴影 是动态的 它将如下图所示 我创建了 TCircleView 它在 drawRect 中绘制颜色为了显示类似的注释 我创建了 TCir
  • 如何调试 NodeJS 中的套接字挂起错误?

    我收到以下错误 events js 48 throw arguments 1 Unhandled error event Error socket hang up at createHangUpError http js 1091 15 a
  • nuget.org:无法加载服务索引

    这实际上不是一个重复这个问题 https stackoverflow com questions 41185443 nuget connection attempt failed unable to load the service ind
  • Python OrderedDict 按日期排序

    我正在尝试使用 OrderedDict Raymond Hettingersversion http code activestate com recipes 576693 对于 pre2 7 Python 其中我的键是日期 但是它没有正确
  • 默认字典(无)

    我希望有一本包含一组状态转换的字典 我认为我可以使用 states defaultdict None 来做到这一点 但它没有按我的预期工作 例如 states defaultdict None if new state 1 states S
  • jQuery Tablesorter 的日期排序问题

    我正在尝试对具有类似列的表进行排序2009 12 17 23 59 59 0 我正在使用下面的应用排序 document ready function dataTable tablesorter 但它不适用于 yyyy mm dd 格式的日
  • 比较 numpy.save 和 h5py 的速度时如何获得一致的结果?

    我正在尝试比较两种工具的速度效率 这两种工具可以节省 2 GB 的空间numpy array到磁盘到文件 numpy save and h5py create dataset 注意 这只是第一个测试 我必须处理的真实情况是数千个大小在 1
  • R data.table 使用 lapply 创建自定义函数来创建和重新分配多个变量

    我有以下几行代码 DT flag T temp haz 1 5 DT temp na locf temp na rm FALSE pid DT agedays 61 haz 1 5 1 temp 我需要将其转换为一个函数 以便它可以处理一系
  • 哪种报告技术? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 哪种报告技术最适合最佳情况 产品类型 我现在在想3技术 嵌入式报告 Crystal Reports M
  • codeigniter + 密码需要字母和数字

    我想使用表单验证来要求同时包含字母和数字字符的密码 到目前为止 这是我想到的 this gt form validation gt set rules password Password required matches passconf
  • Rust musl Docker 镜像找不到 Cargo

    我正在尝试让 Rust 在 Docker 中运行 以将其用于 32 位 musl 构建 自从我更新它以使用新的 URL 来拉 rustup 后 我在使用 bash 交互运行容器时遇到了这个问题 root 2c3549fe3169 sampl