Может ли Docker решить проблему несовпадения общих библиотек C? - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь запустить некоторый код на haskell на хосте ubuntu (18.04), который был скомпилирован на моем ноутбуке.

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, и он не работал (та же ошибка 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 голосов
/ 16 октября 2018

Почему у меня возникает эта проблема?Я думал, что где-то читал, что glibc обратно совместим?

GLIBC имеет обратную совместимость (программы, созданные на старом GLIBC, продолжают работать на более новом GLIBC), но обратное неверно.

В вашем случае вы использовали более новую (GLIBC-2.28) систему и пытаетесь запустить более старую (GLIBC-2.27).Это не гарантированно работает (хотя это может быть достаточно для достаточно простых программ).

Есть ли способ использовать docker, чтобы обойти эту проблему?

Вам нужно build против самой старой версии GLIBC, которую вы планируете использовать.

Вы можете достичь этого несколькими способами:

  • использовать Linux к более старому кросс-компилятору Linux
  • использовать среду сборки chroot
  • использовать контейнер докера со старым GLIBC во время сборки .

Или вы можете запустить в док-контейнере с GLIBC-2.28, который нужен вашей программе.

...