Docker构建Rust项目时openssl-sys v0.9.80编译失败求助
Rust Docker构建OpenSSL相关问题排查与解决
问题背景
Docker中构建Rust项目时遭遇OpenSSL相关编译失败,此前构建正常,近期突然出错。尝试更换镜像、安装libssl-dev均无效。以下是相关配置与报错信息:
原Dockerfile
FROM rust:slim AS builder RUN apt-get update -y && \ apt-get install -y make g++ libssl-dev && \ rustup target add x86_64-unknown-linux-gnu WORKDIR /app COPY . . RUN cargo build --release --target x86_64-unknown-linux-gnu FROM gcr.io/distroless/cc COPY --from=builder /app/target/x86_64-unknown-linux-gnu/release/rebot /bin/rebot ENTRYPOINT [ "/bin/rebot" ]
初始编译错误
#11 426.3 error: failed to run custom build command for `openssl-sys v0.9.80` #11 426.3 #11 426.3 Caused by: #11 426.3 process didn't exit successfully: `/app/target/release/build/openssl-sys-a00b6be9953405cd/build-script-main` (exit status: 101) #11 426.3 --- stdout #11 426.3 cargo:rustc-cfg=const_fn #11 426.3 cargo:rustc-cfg=openssl #11 426.3 cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR #11 426.3 X86_64_UNKNOWN_LINUX_GNU_OPENSSL_LIB_DIR unset #11 426.3 cargo:rerun-if-env-changed=OPENSSL_LIB_DIR #11 426.3 OPENSSL_LIB_DIR unset #11 426.3 cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_INCLUDE_DIR #11 426.3 X86_64_UNKNOWN_LINUX_GNU_OPENSSL_INCLUDE_DIR unset #11 426.3 cargo:rerun-if-env-changed=OPENSSL_INCLUDE_DIR #11 426.3 OPENSSL_INCLUDE_DIR unset #11 426.3 cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_GNU_OPENSSL_DIR #11 426.3 X86_64_UNKNOWN_LINUX_GNU_OPENSSL_DIR unset #11 426.3 cargo:rerun-if-env-changed=OPENSSL_DIR #11 426.3 OPENSSL_DIR unset #11 426.3 cargo:rerun-if-env-changed=OPENSSL_NO_PKG_CONFIG #11 426.3 cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS_x86_64-unknown-linux-gnu #11 426.3 cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS_x86_64_unknown_linux_gnu #11 426.3 cargo:rerun-if-env-changed=TARGET_PKG_CONFIG_ALLOW_CROSS #11 426.3 cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS #11 426.3 cargo:rerun-if-env-changed=PKG_CONFIG_x86_64-unknown-linux-gnu #11 426.3 cargo:rerun-if-env-changed=PKG_CONFIG_x86_64_unknown_linux_gnu #11 426.3 cargo:rerun-if-env-changed=TARGET_PKG_CONFIG #11 426.3 cargo:rerun-if-env-changed=PKG_CONFIG #11 426.3 cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64-unknown-linux-gnu #11 426.3 cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64_unknown_linux_gnu #11 426.3 cargo:rerun-if-env-changed=TARGET_PKG_CONFIG_SYSROOT_DIR #11 426.3 cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR #11 426.3 run pkg_config fail: "pkg-config has not been configured to support cross-compilation. Install a sysroot for the target platform and configure it via PKG_CONFIG_SYSROOT_DIR and PKG_CONFIG_PATH, or install a cross-compiling wrapper for pkg-config and set it via PKG_CONFIG environment variable." #11 426.3 #11 426.3 --- stderr #11 426.3 thread 'main' panicked at ' Could not find directory of OpenSSL installation, and this `-sys` crate cannot proceed without this knowledge. If OpenSSL is installed and this crate had trouble finding it, you can set the `OPENSSL_DIR` environment variable for the compilation process. Make sure you also have the development packages of openssl installed. For example, `libssl-dev` on Ubuntu or `openssl-devel` on Fedora. If you're in a situation where you think the directory *should* be found automatically, please open a bug at https://github.com/sfackler/rust-openssl and include information about your system as well as this message. $HOST = aarch64-unknown-linux-gnu $TARGET = x86_64-unknown-linux-gnu openssl-sys = 0.9.80 It looks like you're compiling on Linux and also targeting Linux. Currently this requires the `pkg-config` utility to find OpenSSL but unfortunately `pkg-config` could not be found. If you have OpenSSL installed you can likely fix this by installing `pkg-config`. ', /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/openssl-sys-0.9.80/build/find_normal.rs:191:5 #11 426.3 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace #11 426.3 warning: build failed, waiting for other jobs to finish... ------ executor failed running [/bin/sh -c cargo build --release --target x86_64-unknown-linux-gnu]: exit code: 101
添加vendored特性后的新错误
修改的Cargo依赖:
openssl-sys = "0.9.82" openssl = { version = "0.10.47", features = ["vendored"] }
编译报错:
#14 93.18 make[1]: Leaving directory '/rebot/target/x86_64-unknown-linux-musl/release/build/openssl-sys-5963a97b9196664b/out/openssl-build/build/src' #14 93.18 #14 93.18 --- stderr #14 93.18 cc1: error: unrecognized command-line option '-m64' #14 93.18 cc1: error: unrecognized command-line option '-m64' #14 93.18 make[1]: *** [Makefile:679: apps/app_rand.o] Error 1 #14 93.18 make: *** [Makefile:177: build_libs] Error 2 #14 93.18 thread 'main' panicked at ' Error building OpenSSL: Command: cd "/rebot/target/x86_64-unknown-linux-musl/release/build/openssl-sys-5963a97b9196664b/out/openssl-build/build/src" && MAKEFLAGS="-j --jobserver-fds=9,14 --jobserver-auth=9,14" "make" "build_libs" Exit status: exit status: 2 ', /usr/local/cargo/registry/src/github.com-1ecc6299db9ec823/openssl-src-111.25.2+1.1.1t/src/lib.rs:505:13 #14 93.18 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace #14 93.18 warning: build failed, waiting for other jobs to finish...
错误原因分析
- 初始错误:构建环境为ARM64(
aarch64-unknown-linux-gnu),目标架构是x86_64,属于交叉编译场景。系统安装的libssl-dev是ARM64版本,x86_64编译无法找到对应架构的库;同时缺少pkg-config工具,且未配置pkg-config支持交叉编译。 - vendored特性报错:交叉编译时未指定x86_64架构的交叉编译gcc,导致默认使用ARM64版本的gcc处理x86_64编译选项(
-m64),而ARM版本gcc不识别该选项。
解决思路
方案1:移除交叉编译(非跨架构需求)
如果不需要构建x86_64架构的二进制,直接使用构建环境默认目标编译:
修改后的Dockerfile:
FROM rust:slim AS builder RUN apt-get update -y && \ apt-get install -y make g++ libssl-dev pkg-config WORKDIR /app COPY . . RUN cargo build --release FROM gcr.io/distroless/cc COPY --from=builder /app/target/release/rebot /bin/rebot ENTRYPOINT [ "/bin/rebot" ]
方案2:配置完整交叉编译环境(跨架构需求)
- 安装x86_64交叉编译工具链、对应架构的libssl-dev及pkg-config
- 设置环境变量指定交叉编译工具和pkg-config路径
修改后的builder阶段:
FROM rust:slim AS builder RUN apt-get update -y && \ apt-get install -y make g++ pkg-config gcc-x86-64-linux-gnu libssl-dev:amd64 && \ rustup target add x86_64-unknown-linux-gnu WORKDIR /app COPY . . # 设置交叉编译相关环境变量 ENV PKG_CONFIG_ALLOW_CROSS=1 ENV PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig ENV CC=x86_64-linux-gnu-gcc RUN cargo build --release --target x86_64-unknown-linux-gnu
方案3:正确使用vendored特性
- 安装x86_64交叉编译gcc
- 指定交叉编译工具链
- 统一Cargo依赖版本(无需单独指定
openssl-sys)
修改后的配置:
- Cargo.toml:
openssl = { version = "0.10.47", features = ["vendored"] }
- Dockerfile builder阶段:
FROM rust:slim AS builder RUN apt-get update -y && \ apt-get install -y make g++ pkg-config gcc-x86-64-linux-gnu && \ rustup target add x86_64-unknown-linux-gnu WORKDIR /app COPY . . ENV CC=x86_64-linux-gnu-gcc RUN cargo build --release --target x86_64-unknown-linux-gnu
内容的提问来源于stack exchange,提问作者Dmitry Dyachkov
相关产品推荐
相关产品推荐

