You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker中Conda环境下无法编译Rust项目求助

问题:Docker构建Sightglass基准镜像时WASI目标编译失败

我尝试构建基于Sightglass基准测试套件的Docker镜像,对应的Dockerfile如下:

FROM ubuntu:22.04
RUN echo 'APT::Install-Suggests "0";' >> /etc/apt/apt.conf.d/00-docker
RUN echo 'APT::Install-Recommends "0";' >> /etc/apt/apt.conf.d/00-docker
RUN DEBIAN_FRONTEND=noninteractive \
  apt-get update \
  && apt-get install -y python3 \
  && rm -rf /var/lib/apt/lists/*
WORKDIR /usr/src
ADD rust-benchmark rust-benchmark
WORKDIR /usr/src/rust-benchmark
RUN apt update --yes
RUN apt install clang lldb lld wget curl git xz-utils bzip2 --yes
RUN apt-get install --reinstall ca-certificates --yes
RUN apt-get install libgl1-mesa-glx libegl1-mesa libxrandr2 libxrandr2 libxss1 libxcursor1 libxcomposite1 libasound2 libxi6 libxtst6 -y
RUN mkdir /usr/local/share/ca-certificates/cacert.org
RUN wget -P /usr/local/share/ca-certificates/cacert.org http://www.cacert.org/certs/root.crt http://www.cacert.org/certs/class3.crt
RUN update-ca-certificates
RUN git config --global http.sslCAinfo /etc/ssl/certs/ca-certificates.crt
RUN wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh --no-check-certificate
RUN cd / && find . -name cargo
RUN chmod +x Anaconda3-2022.10-Linux-x86_64.sh
RUN yes yes | ./Anaconda3-2022.10-Linux-x86_64.sh
RUN rm Anaconda3-2022.10-Linux-x86_64.sh
RUN echo "export PATH=./yes/bin:$PATH" >>  ~/.bashrc 
ENV CONDA ./yes/bin/
ENV PATH="${CONDA}:${PATH}"
RUN ln -s ./yes/bin/conda /usr/local/bin/conda
RUN eval $(conda shell.bash hook)
RUN conda init bash
RUN conda update --all 
RUN cd / && find . -name cargo
RUN conda create -c conda-forge -n rustenv rust
RUN activate rustenv
SHELL ["./yes/bin/conda", "run", "-n", "rustenv", "/bin/bash", "-c"]
RUN rustc --version
ENV GIT_SSL_NO_VERIFY=1
RUN git clone https://github.com/emscripten-core/emsdk.git
RUN cd emsdk && git pull
RUN chmod +x ./emsdk/emsdk
RUN ./emsdk/emsdk install latest
RUN ./emsdk/emsdk activate latest
RUN chmod +x ./emsdk/emsdk_env.sh
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
RUN cd emsdk && source ./emsdk_env.sh
RUN ./emsdk/emsdk_env.sh
ENV EMSDK ./emsdk
ENV EMSCRIPTEN=${EMSDK}/emscripten/sdk
ENV EM_DATA ${EMSDK}/.data
ENV EM_CONFIG ${EMSDK}/.emscripten
ENV EM_CACHE ${EM_DATA}/cache
ENV EM_PORTS ${EM_DATA}/ports
ENV PATH="${EMSDK}:${EMSDK}/emscripten/sdk:${EMSDK}/llvm/clang/bin:${EMSDK}/node/current/bin:${EMSDK}/binaryen/bin:${PATH}"
RUN curl https://sh.rustup.rs -ksSf | sh -s --  -y
RUN chmod +x  $HOME/.cargo/env
RUN $HOME/.cargo/env
ENV RUST ~/.cargo/bin
ENV PATH="${RUST}:${PATH}"
RUN rustup default nightly
RUN rustup target add wasm32-wasi --toolchain nightly
RUN ./yes/envs/rustenv/bin/cargo build --release --target wasm32-wasi 
RUN cp target/wasm32-wasi/release/bls-381-wasm-benchmark.wasm /benchmark.wasm

构建过程在编译步骤中止,出现如下错误:

error[E0463]: can't find crate for `core`
  |
  = note: the `wasm32-wasi` target may not be installed
  = help: consider downloading the target with `rustup target add wasm32-wasi`

error[E0463]: can't find crate for `compiler_builtins`

问题根源

Dockerfile中同时使用conda安装的Rust和rustup安装的Rust,两者环境相互冲突:最后调用的是conda环境中的cargo,但rustup target add是给rustup安装的Rust添加wasm32-wasi目标,导致编译时使用的cargo找不到对应的WASI目标文件。

修复方案

1. 清理重复的Rust环境

移除conda安装Rust的相关步骤,统一使用rustup管理Rust环境,避免环境冲突。

2. 确保WASI目标与编译环境关联

在安装rustup和nightly工具链后,添加wasm32-wasi目标,直接使用rustup安装的cargo进行编译。

3. 简化环境变量配置

调整PATH顺序,确保rustup的cargo优先级最高,避免调用到其他环境的cargo。

修改后的Dockerfile如下:

FROM ubuntu:22.04
RUN echo 'APT::Install-Suggests "0";' >> /etc/apt/apt.conf.d/00-docker
RUN echo 'APT::Install-Recommends "0";' >> /etc/apt/apt.conf.d/00-docker
RUN DEBIAN_FRONTEND=noninteractive \
  apt-get update \
  && apt-get install -y python3 \
  && rm -rf /var/lib/apt/lists/*
WORKDIR /usr/src
ADD rust-benchmark rust-benchmark
WORKDIR /usr/src/rust-benchmark

# 安装基础依赖
RUN apt update --yes \
    && apt install clang lldb lld wget curl git xz-utils bzip2 --yes \
    && apt-get install --reinstall ca-certificates --yes \
    && apt-get install libgl1-mesa-glx libegl1-mesa libxrandr2 libxss1 libxcursor1 libxcomposite1 libasound2 libxi6 libxtst6 -y \
    && rm -rf /var/lib/apt/lists/*

# 配置CA证书
RUN mkdir /usr/local/share/ca-certificates/cacert.org \
    && wget -P /usr/local/share/ca-certificates/cacert.org http://www.cacert.org/certs/root.crt http://www.cacert.org/certs/class3.crt \
    && update-ca-certificates \
    && git config --global http.sslCAinfo /etc/ssl/certs/ca-certificates.crt

# 安装Anaconda(保留原需求,若无需可移除)
RUN wget https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh --no-check-certificate \
    && chmod +x Anaconda3-2022.10-Linux-x86_64.sh \
    && yes yes | ./Anaconda3-2022.10-Linux-x86_64.sh \
    && rm Anaconda3-2022.10-Linux-x86_64.sh

# 配置conda环境(移除rustenv相关)
ENV CONDA /root/anaconda3/bin
ENV PATH="${CONDA}:${PATH}"
RUN ln -s ${CONDA}/conda /usr/local/bin/conda \
    && eval $(conda shell.bash hook) \
    && conda init bash \
    && conda update --all -y

# 安装emsdk
ENV GIT_SSL_NO_VERIFY=1
RUN git clone https://github.com/emscripten-core/emsdk.git \
    && cd emsdk && git pull \
    && chmod +x ./emsdk \
    && ./emsdk install latest \
    && ./emsdk activate latest \
    && chmod +x ./emsdk_env.sh

# 配置emsdk环境变量
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
ENV EMSDK /usr/src/rust-benchmark/emsdk
ENV EMSCRIPTEN=${EMSDK}/upstream/emscripten
ENV PATH="${EMSDK}:${EMSDK}/upstream/emscripten:${EMSDK}/upstream/bin:${PATH}"

# 安装rustup和nightly工具链
RUN curl https://sh.rustup.rs -ksSf | sh -s -- -y
ENV PATH="/root/.cargo/bin:${PATH}"
RUN rustup default nightly \
    && rustup target add wasm32-wasi --toolchain nightly

# 使用rustup的cargo编译WASI目标
RUN cargo build --release --target wasm32-wasi 
RUN cp target/wasm32-wasi/release/bls-381-wasm-benchmark.wasm /benchmark.wasm

内容的提问来源于stack exchange,提问作者Achim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 15:55:18