【问题标题】:Install modules with perlbrew and cpm - perlbrew switch does not change @INC during docker build使用 perlbrew 和 cpm 安装模块 - perlbrew 开关在 docker build 期间不会更改 @INC
【发布时间】:2019-06-14 01:48:11
【问题描述】:

我想在我的项目中使用快速的cpm 模块安装程序而不是 cpanm。

我还使用 perlbrew 安装目标 perl 版本。

根据 cpm -g 选项的documentation 将模块安装到当前@INC 中

如何在 Dockerfile 中强制 perlbrew 更改 @INC ?

以下是我的 Dockerfile 的一部分

RUN perl -le 'print for @INC' && \
    perlbrew switch perl-5.31.0 && \
    perl -le 'print for @INC' && \
    cpm install -gv CGI && \
    perlbrew list-modules

当我构建 Dockerfile 时,perl -le 'print for @INC' 的输出两次都相同:

/etc/perl
/usr/local/lib/x86_64-linux-gnu/perl/5.22.1
/usr/local/share/perl/5.22.1
/usr/lib/x86_64-linux-gnu/perl5/5.22
/usr/share/perl5
/usr/lib/x86_64-linux-gnu/perl/5.22
/usr/share/perl/5.22
/usr/local/lib/site_perl
/usr/lib/x86_64-linux-gnu/perl-base

但如果我手动执行相同的操作,结果是可以的:

$ docker run -it pavelsr/xxxhub
root@1a34ea34a3fb:/# perl -le 'print for @INC'
/etc/perl
/usr/local/lib/x86_64-linux-gnu/perl/5.22.1
/usr/local/share/perl/5.22.1
/usr/lib/x86_64-linux-gnu/perl5/5.22
/usr/share/perl5
/usr/lib/x86_64-linux-gnu/perl/5.22
/usr/share/perl/5.22
/usr/local/lib/site_perl
/usr/lib/x86_64-linux-gnu/perl-base
.
root@1a34ea34a3fb:/# perlbrew switch perl-5.31.0

A sub-shell is launched with perl-5.31.0 as the activated perl. Run 'exit' to finish it.

root@1a34ea34a3fb:/# perl -le 'print for @INC'
/usr/local/perlbrew/perls/perl-5.31.0/lib/site_perl/5.31.0/x86_64-linux
/usr/local/perlbrew/perls/perl-5.31.0/lib/site_perl/5.31.0
/usr/local/perlbrew/perls/perl-5.31.0/lib/5.31.0/x86_64-linux
/usr/local/perlbrew/perls/perl-5.31.0/lib/5.31.0
root@1a34ea34a3fb:/# cpm install -g CGI
DONE install HTML-Tagset-3.20
DONE install HTML-Parser-3.72
DONE install CGI-4.44
3 distributions installed.
root@1a34ea34a3fb:/# perlbrew list-modules
CGI
HTML::Parser
HTML::Tagset
Perl

【问题讨论】:

  • Re "A sub-shell is launch with",好吧,首先,您没有按照说明将source "${PERLBREW_ROOT:-$HOME/perl5/perlbrew}"/etc/bashrc 添加到.bashrcperlbrew useperlbrew switch 只需操作 PATH。为了能够做到这一点,源脚本在 shell 中创建了一个名为 perlbrew 的函数。作为缺少这些功能时的后备方案,还有一个名为 perlbrew 的脚本。该脚本显然无法更改调用它的 shell 的 PATH,因此它会启动一个子 shell,而改用已修复的 PATH
  • 因此,如果没有这些功能,您的管道不可能受到perlbrew switch 的影响。首先解决这个问题。
  • Re "如何在 Dockerfile 中强制 perlbrew 更改 @INC ?",尽管重复声明声称您想要更改 @INC,但这不是您想要做的。您实际上想更改正在使用的perl 的安装。
  • @ikegami 非常感谢您的详细解释。但我不知道 perlbrew 如何以及何时修复 $PATH。我尝试在RUN echo 'source "${PERLBREW_ROOT}"/etc/bashrc' >> .bashrc 之前和之后打印$PATH,步骤,它没有改变,在这两种情况下都是/usr/local/perlbrew/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  • 目前我只是直接在Dockerfile中设置PATH:ENV PATH ${PERLBREW_ROOT}/perls/perl-$PERL_VERSION/bin:$PATH

标签: perl docker perlbrew cpanm


【解决方案1】:

对于初学者来说,“A sub-shell is launch with ...”表示您的设置不正确perlbrew。系统指示您将以下内容添加到 shell 的启动脚本中:

source "${PERLBREW_ROOT:-$HOME/perl5/perlbrew}"/etc/bashrc

没有这个,回退机制被用来尝试提供所需的功能,但它在交互式 shell 之外完全没用。


其次,这是一个相当可疑的 perlbrew 用法。如果您的 docker 脚本按预期工作,它将产生深远的影响。这不是一件好事。您可以使用perlbrew use,但您可以直接使用正确的perl 构建

RUN "${PERLBREW_ROOT:-$HOME/perl5/perlbrew}"/perls/perl-5.31.0/bin/perl -S cpm install -gv CGI

在你的情况下,这应该解决

RUN /usr/local/perlbrew/perls/perl-5.31.0/bin/perl -S cpm install -gv CGI

为你。

【讨论】:

  • RUN ${PERLBREW_ROOT}/perls/perl-$PERL_VERSION/bin/perl --version 显示正确的版本,但RUN ${PERLBREW_ROOT}/perls/perl-$PERL_VERSION/bin/perl cpm install -gv CGI && perlbrew list-modules 会产生Can't open perl script "cpm": No such file or directory 错误。
  • 抱歉,请提供cpm 的完整路径或使用.../perl -S cpm ...。 (-S 告诉 Perl 搜索脚本的路径。)已修复。
猜你喜欢
  • 2015-06-08
  • 1970-01-01
  • 2015-05-07
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
相关资源
最近更新 更多