【问题标题】:Can docker solve a problem of mismatched C shared libraries?docker能解决C共享库不匹配的问题吗?
【发布时间】:2018-10-15 19:12:58
【问题描述】:

我正在尝试在我的笔记本电脑上编译的 ubuntu (18.04) 主机上运行一些 haskell 代码。

host: 4.15.0-36-generic #39-Ubuntu SMP Mon Sep 24 16:19:09 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

laptop: 4.14.74-1-MANJARO #1 SMP PREEMPT Fri Oct 5 14:16:52 UTC 2018 x86_64 GNU/Linux

我得到的错误是

/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found

经过一番研究,我了解到这是因为我的笔记本电脑安装了 2.28 版本的 glibc,但主机只有 libc6 2.27。

我做了一些谷歌搜索,发现也许 docker 可以解决这个问题。但是,我刚刚使用以下 Dockerfile 创建了一个 docker 映像,但它不起作用(同样的 GLIBC_2.28 错误)

FROM fpco/stack-build:lts-12.9 as builder

RUN mkdir /opt/build
COPY . /opt/build
RUN cd /opt/build && stack build 

FROM ubuntu:18.04
RUN mkdir -p /opt/myapp
WORKDIR /opt/myapp
RUN apt-get update && apt-get install -y \
  ca-certificates
COPY --from=builder /opt/build/.stack-work/install/x86_64-linux-tinfo6/lts-12.9/8.4.3/bin .
CMD ["/opt/myapp/myapp-exe"]

我不知道现在该做什么。我有几个问题:

  • 为什么我首先会遇到这个问题?我以为我在某处读到 glibc 向后兼容? (glibc 和 libc6.. 一样吗?)

  • 有没有办法使用 docker 来解决这个问题?我可以在 ubuntu 映像中运行我的构建过程吗?例如FROM fcpo/stack-build:lts-12.9 and ubutu:18.04,然后创建另一个 ubuntu 映像,我将二进制文件复制到其中?

  • 以前有没有其他人遇到过这种情况?如果是这样,您是否找到了解决方案(不仅仅是更改操作系统?)?

【问题讨论】:

  • 添加另一层复杂性不太可能简化您的问题。能否在新环境中重新构建程序或远程运行?
  • 我宁愿在我的机器上进行编译,因为主机速度很慢(堆栈需要很长时间来编译所有依赖项没有帮助),而且我的带宽有限。但是是的,理想情况下我会有一台机器,它确实有这样一个最新版本的 glibc...我只是想知道是否有其他人遇到过这个问题并解决了它
  • 可以解决这个问题。你确定你的 docker 镜像有 glibc 2.28 吗?但是你不能只更新主机上的 glibc 吗?
  • 只是澄清混乱:glibc 2 = libc6. glibc 向后兼容意味着新的 glibc 支持为旧 glibc 构建的程序。您需要 glibc 向前兼容,以使基于更高版本的 glibc 构建的程序可以与旧的 glibc 一起使用;不是。

标签: linux docker haskell haskell-stack libc


【解决方案1】:

为什么我首先会遇到这个问题?我以为我在某处读到 glibc 向后兼容?

GLIBC 向后兼容(针对旧 GLIBC 构建的程序继续在新 GLIBC 上运行),但 逆向 不正确。

在您的情况下,您构建在较新的 (GLIBC-2.28) 系统上,并尝试在较旧的 (GLIBC-2.27) 系统上运行。这不能保证有效(尽管它可能适用于足够简单的程序)。

有没有办法使用 docker 来解决这个问题?

您需要针对您计划使用的最旧版本的 GLIBC构建

您可以通过多种方式实现这一目标:

  • 使用 Linux 到旧版 Linux 交叉编译器
  • 使用 chroot 构建环境
  • 在构建时使用具有旧 GLIBC 的 docker 容器

或者您可以在一个 docker 容器中运行,该容器具有您的程序所需的 GLIBC-2.28。

【讨论】:

  • 谢谢!我现在对向后兼容性感到有点愚蠢......我意识到我可以尝试做FROM ubuntu:18.04 $do build$, FROM ubuntu:18.04 $copy executables$
  • hmm 刚刚看了看,图像 fpco/stack-build:lts-12.9 使用 ubuntu 16.04(其 glibc
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多