Docker构建Rust项目执行cargo build --release时提示找不到cmake
问题原因
- 你本地Windows系统安装了cmake并配置了环境变量,所以本地执行cargo命令可以正常编译,但Docker镜像构建是在隔离的Linux容器环境中运行,你使用的
rust:1.62基础镜像默认没有预装cmake、gcc、g++等编译工具。 - prost-build v0.10.4版本在构建时会自动编译内置的protobuf源码,必须依赖cmake和C/C++编译链,容器内找不到cmake命令就会抛出你看到的错误。宿主机的环境变量、已安装软件不会自动同步到Docker构建容器内部。
修复方法
在构建阶段的基础镜像中先安装所需依赖,修改后的Dockerfile如下:
FROM rust:1.62 as build # 安装prost编译所需的系统依赖 RUN apt update && apt install -y cmake build-essential RUN USER=root cargo new --bin web_server WORKDIR /web_server COPY ./Cargo.lock ./Cargo.lock COPY ./Cargo.toml ./Cargo.toml COPY ./src ./src COPY build.rs build.rs COPY ./proto ./proto RUN cargo build --release FROM debian:buster-slim COPY --from=build /web_server/target/release/web_server . CMD ["./web_server"]
构建速度优化(可选)
可以利用Docker的层缓存机制,先拷贝依赖清单文件预编译依赖层,后续修改业务代码时不需要重复编译所有第三方依赖,优化后构建阶段配置如下:
FROM rust:1.62 as build RUN apt update && apt install -y cmake build-essential RUN USER=root cargo new --bin web_server WORKDIR /web_server COPY ./Cargo.lock ./Cargo.lock COPY ./Cargo.toml ./Cargo.toml # 构建空项目缓存依赖 RUN cargo build --release RUN rm src/*.rs COPY ./src ./src COPY build.rs build.rs COPY ./proto ./proto # 仅重新编译业务代码 RUN touch src/main.rs && cargo build --release FROM debian:buster-slim COPY --from=build /web_server/target/release/web_server . CMD ["./web_server"]
内容的提问来源于stack exchange,提问作者Tuen
相关产品推荐
相关产品推荐

