我想在我的项目中使用快速 cpm 模块安装程序而不是 cpanm。
我也使用perlbrew安装目标perl版本。
根据 cpm 的文档-g
选项会将模块安装到当前@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
对于初学者来说,">子外壳启动时带有......"表示您的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
给你的。