码头工人可以解决不匹配的C共享库的问题吗?

时间:2018-10-15 19:12:58

标签: linux docker haskell haskell-stack libc

我正在尝试在笔记本计算机上编译的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。

我做了一些谷歌搜索,发现也许码头工人可以解决这个问题。但是,我只是使用以下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映像并将二进制文件复制到其中?

  • 是否还有其他人遇到过这个?如果是,您是否找到了解决方案(不仅仅是更改操作系统?)?

1 个答案:

答案 0 :(得分:1)

  

为什么我首先遇到这个问题?我以为我读过glibc向后兼容的地方?

GLIBC 向后兼容(针对旧版GLIBC构建的程序仍可在新版GLIBC上运行),但 inverse 并非如此。

在您的情况下,您在较新的(GLIBC-2.28)系统上构建,并尝试在较旧的(GLIBC-2.27)系统上运行。不能保证能够正常工作(尽管对于足够简单的程序来说可能如此)。

  

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

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

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

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

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