如何设置我的Dockerfile以使用cpanm来安装特定版本的Perl模块?

时间:2016-07-26 19:47:32

标签: perl docker dockerfile cpanm

在我的Dockerfile中,我正在设置将在运行时安装的Perl模块,如下所示:

RUN ["cpanm", "Carp", "Carp::Heavy", "Class::Data::Inheritable"]

但是,对于一个模块,我需要一个特定版本的模块,而不是最新版本。如何在上面的行中指定该版本?

我一直在网上搜索几个小时,但还没有找到任何有用的东西。

3 个答案:

答案 0 :(得分:6)

指定URL,而不是指定模块名称。例如,使用Class::Data::Inheritable

而不是https://cpan.metacpan.org/authors/id/T/TM/TMTM/Class-Data-Inheritable-0.06.tar.gz

您可以转到module page on metacpan,选择所需的版本,然后复制下载链接,找到适用的网址。

PS:您可能还希望在环境中设置PERL_CPANM_OPT=--from https://cpan.metacpan.org/,因此cpanm仅使用HTTPS进行下载。

答案 1 :(得分:4)

要让CPAN安装特定版本的模块,您需要提供包括作者在内的完整模块分发文件名。例如,要在命令行中安装模块Set::Object版本1.28,请执行以下操作:

cpan SAMV/Set-Object-1.28.tar.gz

同样适用于Docker,只需添加

即可
RUN cpan SAMV/Set-Object-1.28.tar.gz

答案 2 :(得分:4)

对于将来搜索此相同答案的任何人,可以在the documentation for cpanm中找到另一个选项:

cpanm Plack@0.9990

如果您有很长的模块列表,请考虑将cpanfile提供给cpanm,而不是将它们全部列在Dockerfile中。

cpanfile中为模块指定特定版本号的最简单方法是这样的:

requires 'Text::ParseWords', '==3.1';

请求最新版本模块的语法如下:

requires 'Text::ParseWords';

申请最低版本:(请注意缺少' ==')

requires 'Text::ParseWords', '3.1';

以其他方式请求特定版本的语法记录良好here

可以找到使用cpanmcpanfile的另一篇精彩文章 在Installation of cpan modules by cpanm and cpanfile