1

我尝试在基于 Alpine 的 docker 容器上安装 MHA 节点。该容器通过 apk 具有 perl、make 和 gcc。:

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

我能做些什么来解决它?

安装 make gcc 后可与 Ubuntu 14.04 一起使用

4

2 回答 2

2

您需要 libperl 头文件才能构建某些模块,包括 DBI。在 Alpine 上,它们看起来像是由 package 提供的perl-dev

于 2016-06-09T16:52:25.653 回答
1

来自http://www.perlmonks.org/bare/?node_id=486526

EXTERN.h 是嵌入解释器和构建 XS 模块所需的 perl C API 的一部分。官方的 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

好的,更多的谷歌搜索也导致了 addin 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"]
于 2016-06-09T21:34:24.203 回答