docker能解决C共享库不匹配的问题吗?

ocs*_*tat 7 linux haskell libc docker haskell-stack

我正在尝试在 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
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found
Run Code Online (Sandbox Code Playgroud)

经过一些研究,我了解到这是因为我的笔记本电脑安装了 glibc 2.28 版本,但主机只有 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"]
Run Code Online (Sandbox Code Playgroud)

我不知道现在该怎么办。我有几个问题:

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

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

  • 以前有其他人遇到过这个吗?如果是这样,您是否找到了解决方案(除了更改操作系统之外?)?

Emp*_*ian 4

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

GLIBC向后兼容的(针对旧 GLIBC 构建的程序继续在较新的 GLIBC 上运行),但反之则不然。

就您而言,您构建在较新的(GLIBC-2.28)系统上,并尝试在较旧的系统(GLIBC-2.27)上运行。这不能保证有效(尽管对于足够简单的程序来说可能如此)。

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

您需要根据您计划使用的最旧版本的 GLIBC进行构建。

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

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

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