【问题标题】:GLIBC incompatibility on debian dockerdebian docker 上的 GLIBC 不兼容
【发布时间】:2022-08-07 11:41:58
【问题描述】:

我正在尝试构建一个以 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 \"Buster\" 目前是one release behind;将运行时映像更改为debian:bullseye-slim 有帮助吗?
  • 是的,我刚刚找到了这个链接packages.debian.org/bullseye/libc6,我意识到我需要下一个。如果您将此作为答案发布,我将标记为已接受,谢谢。

标签: docker glibc


【解决方案1】:

如果您查看Debian releases 的列表,在撰写本文时,Debian 10 “Buster” 落后了一个版本,而 Debian 11 “Bullseye” 是当前发布的稳定版本。您还可以查看libc6 package listing 并看到“Buster”包含 libc6 2.28,“Bullseye”包含 libc6 2.31(均带有本地补丁)。

因此,对于您的设置,它应该可以将最终映像更改为较新版本的 Debian,例如

FROM debian:bullseye-stable # one newer than buster

【讨论】:

    【解决方案2】:

    Rust 默认为主机系统构建二进制文件;这包括编译二进制文件的任何系统的 glibc 版本。最简单的解决方法是使用相同发行版的相同版本在另一个 docker 映像中编译二进制文件.

    你应该不是尝试通过更改发行版以匹配您的二进制文件来解决此问题;每当您在个人计算机(或您用于构建二进制文件的任何计算机)上升级/更改发行版时,您的二进制文件将再次停止工作。

    或者,您可以尝试编译静态二进制文件:(related question)

    rustup target add x86_64-unknown-linux-musl
    cargo build --target=x86_64-unknown-linux-musl
    

    【讨论】:

      猜你喜欢
      • 2015-01-29
      • 2012-06-21
      • 2016-12-09
      • 2016-06-22
      • 1970-01-01
      • 2016-02-10
      • 2019-07-29
      • 2021-10-30
      • 2020-04-21
      相关资源
      最近更新 更多