我正在尝试用rust-rocksdb作为依赖项构建一个rust应用程序。
使用最新的rust docker镜像编译,然后将二进制文件移动到debian。这是我的Dockerfile的样子
FROM rust:1.61 as builder
RUN USER=root cargo new --bin fbrust
WORKDIR ./fbrust
COPY ./Cargo.toml ./Cargo.toml
COPY ./Cargo.lock ./Cargo.lock
RUN apt-get update
&& apt-get install -y ca-certificates tzdata libclang-dev
&& rm -rf /var/lib/apt/lists/*
RUN cargo build --release
RUN rm src/*.rs
ADD . ./
RUN rm ./target/release/deps/fbrust*
RUN cargo build --release
FROM debian:buster-slim
ARG APP=/usr/src/app
EXPOSE 5005
ENV TZ=Etc/UTC
APP_USER=appuser
RUN groupadd $APP_USER
&& useradd -g $APP_USER $APP_USER
&& mkdir -p ${APP}
COPY --from=builder /fbrust/target/release/fbrust ${APP}/fbrust
RUN chown -R $APP_USER:$APP_USER ${APP}
USER $APP_USER
WORKDIR ${APP}
CMD ["./fbrust"]
我现在得到这个错误:
./fbrust: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found (required by ./fbrust)
./fbrust: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.30' not found (required by ./fbrust)
./fbrust: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by ./fbrust)
首先,我很困惑为什么我看到2.29和2.30都是必需的。
我检查了一下,确实是2.28
||/ Name Version Architecture Description
+++-==============-============-============-=================================
ii libc-bin 2.28-10 amd64 GNU C Library: Binaries
是否有任何其他的图像,我可以使用来实现兼容性,或者我可以得到一个提示,我应该尝试什么依赖/设置?
如果您查看Debian发行版列表,在撰写本文时,Debian 10 "Buster"是一个版本之后,而Debian 11"bullseye";是当前发布的稳定版本。您还可以查看libc6包清单,并看到"Buster"包含libc6 2.28和"Bullseye"包含libc6 2.31(包含本地补丁)。
因此,对于您的设置,它应该可以将最终图像更改为较新版本的Debian,如
FROM debian:bullseye-stable # one newer than buster
Rust默认为主机系统构建二进制文件;这包括编译二进制文件的系统的glibc版本。最简单的修复方法是在使用相同发行版的相同版本的另一个docker映像中编译二进制文件。.
你应该不试图通过改变发行版版本来匹配你的二进制文件来解决这个问题;当你在你的个人电脑(或任何你用来构建二进制文件的电脑)上升级/更改发行版时,你的二进制文件将再次停止工作。
或者,您可以尝试编译一个静态二进制文件:(相关问题)
rustup target add x86_64-unknown-linux-musl
cargo build --target=x86_64-unknown-linux-musl