cpanm MIYAGAWA/Plack-0.99_05.tar.gz # full distribution path
cpanm http://example.org/LDS/CGI.pm-3.20.tar.gz # install from URL
cpanm ~/dists/MyCompany-Enterprise-1.00.tar.gz # install from a local file
## Modules
WORKDIR ${APP_ROOT}
# install modules outside of WORKDIR, so it will not interfere when we do COPY . .
RUN mkdir -p ../modules
RUN ln -s ../modules local
RUN cpanm -n -L ./local App::cpm Carton::Snapshot && rm -rf /root/.cpanm
COPY cpanfile ./
COPY cpanfile.snapshot ./
RUN \
--mount=type=cache,target=/root/.perl-cpm \
cpm install -w 16 --no-test -L ./local \
--with-develop
# regenerate cpanfile.snapshot
# https://github.com/miyagawa/Carmel#cpm
# cpm doesn't have the ability to manage cpanfile.snapshot file on its own.
RUN carton install
# You can copy snapshot from container by running:
# docker cp <container_name>:${APP_ROOT}/cpanfile.snapshot.latest ./cpanfile.snapshot
4条答案
按热度按时间wn9m85ua1#
指定URL而不是指定模块名称。例如,使用
https://cpan.metacpan.org/authors/id/T/TM/TMTM/Class-Data-Inheritable-0.06.tar.gz
而不是Class::Data::Inheritable
您可以转到module page on metacpan,选择所需的版本,然后复制下载链接,找到适用的URL。
PS:您可能还想在环境中设置
PERL_CPANM_OPT=--from https://cpan.metacpan.org/
,以便cpanm
仅使用HTTPS
下载。relj7zay2#
对于将来寻找相同答案的人,可以在the documentation for
cpanm
中找到另一个选项:如果您有一个很长的模块列表,考虑将一个
cpanfile
放入cpanm
,而不是将它们全部列在Dockerfile中。为
cpanfile
中的模块指定特定版本号的最简单方法如下:请求模块最新版本的语法如下:
请求最低版本:(注意缺少'==')
以其他方式请求特定版本的语法在here中有很好的说明。
关于
cpanm
和cpanfile
的另一个很好的使用记录可以在Installation of cpan modules by cpanm and cpanfile中找到。xt0899hw3#
要让CPAN安装模块的特定版本,您需要提供完整的模块分发文件名,包括作者。例如,要安装模块
Set::Object
版本1.28
,请在命令行键入:Docker也是如此,只需添加
7fhtutme4#
要指定可以使用的目标模块版本,请执行以下操作
参见官方文档:https://metacpan.org/dist/App-cpanminus/view/bin/cpanm
但我认为使用
cpanfile
更好。请参阅--cpanfile
选项https://metacpan.org/dist/App-cpanminus/view/bin/cpanm#-cpanfile和此文件的格式https://metacpan.org/pod/cpanfile但是如果你有很多模块(像我一样),我推荐使用
cpm
。它并行安装模块非常快。而且在docker的帮助下,我们可以缓存构建,因此重建将花费几秒钟。下面是我的Dockerfile
: