Запуск Mkbootstrap для DBI() => DBIXS.h:22:20: фатальная ошибка: EXTERN.h: Нет такого файла или каталога

Я пытаюсь установить узел MHA в док-контейнер на основе Alpine. Контейнер имеет perl, make и gcc через apk. :

RUN apk add --update perl make gcc 

Необходимым условием для узла MHA является DBD::mysql. Команда

perl -MCPAN -e 'install DBD::mysql'

приводит к указанной выше ошибке. Гугл об этом ничего не знает.

Однако следующие команды, необходимые для диспетчера MHA, работают нормально:

perl -MCPAN -e "install Config::Tiny"
perl -MCPAN -e "install Log::Dispatch"
perl -MCPAN -e "install Parallel::ForkManager"

Проблема явно связана с DBI:

Running Mkbootstrap for DBI ()
chmod 644 "DBI.bs"
"/usr/bin/perl" -p -e "s/~DRIVER~/Perl/g" ./Driver.xst > Perl.xsi
"/usr/bin/perl" "/usr/share/perl5/core_perl/ExtUtils/xsubpp"  -typemap "/usr/share/perl5/core_perl/ExtUtils/typemap" -typemap "typemap"  Perl.xs > Perl.xsc && mv Perl.xsc Perl.c
cc -c   -D_REENTRANT -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -Os -fomit-frame-pointer   -DVERSION=\"1.636\" -DXS_VERSION=\"1.636\" -fPIC "-I/usr/lib/perl5/core_perl/CORE"  -W -Wall -Wpointer-arith -Wbad-function-cast -Wno-comment -Wno-sign-compare -Wno-cast-qual -Wmissing-noreturn -Wno-unused-parameter Perl.c
In file included from Perl.xs:7:0:
DBIXS.h:22:20: fatal error: EXTERN.h: No such file or directory
compilation terminated.
Makefile:625: recipe for target 'Perl.o' failed
make: *** [Perl.o] Error 1
  TIMB/DBI-1.636.tar.gz
  /usr/bin/make -- NOT OK

Что я могу сделать, чтобы решить эту проблему?

Работает с Ubuntu 14.04 после установки make gcc


person kklepper    schedule 06.06.2016    source источник


Ответы (2)


Вам нужны заголовки libperl, чтобы иметь возможность создавать определенные модули, включая DBI. На Alpine похоже, что они предоставляются пакетом perl-dev.

person hobbs    schedule 09.06.2016

Из http://www.perlmonks.org/bare/?node_id=486526

EXTERN.h является частью Perl C API, который необходим для встраивания интерпретатора и создания модулей XS. Официальный дистрибутив perl содержит все эти файлы, но многие дистрибутивы linux не включают его в базовый пакет perl (некоторые даже пропускают множество основных модулей). В вашем дистрибутиве должен быть один или несколько дополнительных пакетов, которые предоставляют файлы C API. Обычно они называются "perl-dev" или что-то в этом роде. (По гуглению пакет mandrage выглядит так: «perl-devel-5.*.rpm»)

Так решение выглядело как добавление perl-dev в команду apk add, но этого оказалось недостаточно:

In file included from DBIXS.h:23:0,
                 from Perl.xs:7:
/usr/lib/perl5/core_perl/CORE/perl.h:699:23: fatal error: sys/types.h: No such file or directory
compilation terminated.
Makefile:628: recipe for target 'Perl.o' failed

Хорошо, еще несколько поисков в Google также привели к добавлению musl-dev. Теперь это работает:

FROM alpine

ENV MHA_NODE_VERSION=0.54 \
    MHA_MANAGER_VERSION=0.55

COPY ./mha/* /tmp/
# mha4mysql-manager-0.55.tar.gz
# mha4mysql-node-0.54.tar.gz

RUN apk add --update perl perl-dev musl-dev make gcc \
  && perl -MCPAN -e 'install DBD::mysql' \
  && perl -MCPAN -e "install Config::Tiny" \
  && perl -MCPAN -e "install Log::Dispatch" \
  && perl -MCPAN -e "install Parallel::ForkManager" \
  && cd /tmp \
  && tar -zxf mha4mysql-node-${MHA_NODE_VERSION}.tar.gz \
  && cd mha4mysql-node-${MHA_NODE_VERSION}/ \
  && perl Makefile.PL \
  && make \
  && make install \
  && cd /tmp \
  && tar -zxf mha4mysql-manager-${MHA_MANAGER_VERSION}.tar.gz \
  && cd mha4mysql-manager-${MHA_MANAGER_VERSION}/ \
  && perl Makefile.PL \
  && make \
  && make install \
  && apk del make gcc musl-dev perl-dev \
  && rm -rf /var/cache/apk/*

ENTRYPOINT ["/usr/bin/perl", "-de0"]
person kklepper    schedule 09.06.2016