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
相关产品推荐
相关产品推荐

