perl 运行cpanm时docker build失败

slmsl1lt  于 2023-10-24  发布在  Perl
关注(0)|答案(3)|浏览(146)

在Docker容器中,我有一个Perl脚本,我需要能够解析JSON,我试图在我的Dockerfile中为Perl安装CPAN JSON
所以我在我的Dockerfile中执行以下操作

FROM centos:7.9.2009
RUN yum install -y cpanm \
      perl \
      perl-App-cpanminus \
      perl-Config-Tiny \
      sudo \
      &&  yum clean all \
      && sudo cpanm install JSON;

但是当我做一个docker build时,我得到:

#0 41.76 Configuring Test-Simple-1.302195 ... OK
#0 41.95 Building and testing Test-Simple-1.302195 ... OK
#0 68.48 Successfully installed Test-Simple-1.302195
#0 68.59 Building and testing JSON-4.10 ... OK
#0 126.9 Successfully installed JSON-4.10
#0 127.0 2 distributions installed
------
ERROR: failed to solve: executor failed running [/bin/sh -c yum install -y cpanm     perl     perl-App-cpanminus     perl-Config-Tiny     sudo     &&  yum clean all     && sudo cpanm install JSON;]: exit code: 1

有什么问题吗?

mznpcxlj

mznpcxlj1#

这并没有回答你的问题,但是我最近不得不通过弄清楚如何找到cpanm错误来调试cpanm情况(尽管设置--verbose也可以工作)。
首先,找到构建遗留的容器ID。这可能是最新的容器,但命令也将以PERL_CARTON_MIRROR环境变量开始:

$ docker ps -a
CONTAINER ID   IMAGE                    COMMAND     ...
2eae7f9e757a   9e2398121731             "cpanm …"   ...

使用容器ID(第一列)将该容器提交到映像:

$ docker commit 2eae7f9e757a
sha256:6887b59a7ed957c3ff38d0652929847a1ef200461e8f117c6a2746f066206b3f

现在获取cpanm构建日志:

$ docker cp -L 6887b59a7ed9:/root/.cpanm/build.log build.log
yhived7q

yhived7q2#

有两个问题需要解决。
1.软件包cpanm无法安装在第一位。运行docker run -it centos:7.9.2009 /bin/bash并在容器中执行yum install -y cpanm。我得到:
没有可用的软件包cpanm。
错误:无事可做
当我运行yum install -y cpanm perl sudo perl-App-cpanminus,然后运行echo $?时,返回的是0,因为它确实安装了其他软件包。这意味着这个阶段不是破坏您构建的原因。这是因为为了从cpanm安装软件包,您需要的软件包是perl-App-cpanminus。要解决这个问题,只要从要安装的模块列表中删除cpanm(因为你已经安装了perl-App-cpanminus)。因为这不会破坏构建,所以它不是严格必要的,只是强烈推荐。
1.然后运行cpanm install JSON命令返回:

[root@aabe6178c007 /]# cpanm install JSON
--> Working on install
Fetching http://www.cpan.org/authors/id/D/DA/DAGOLDEN/install-0.01.tar.gz ... OK
Configuring install-0.01 ... OK
Building and testing install-0.01 ... FAIL
! Installing install failed. See /root/.cpanm/work/1692109504.103/build.log for details. Retry with --force to force install it.
--> Working on JSON
Fetching http://www.cpan.org/authors/id/I/IS/ISHIGAKI/JSON-4.10.tar.gz ... OK
Configuring JSON-4.10 ... OK
==> Found dependencies: Test::More
--> Working on Test::More
Fetching http://www.cpan.org/authors/id/E/EX/EXODIST/Test-Simple-1.302195.tar.gz ... OK
Configuring Test-Simple-1.302195 ... OK
Building and testing Test-Simple-1.302195 ... OK
Successfully installed Test-Simple-1.302195
Building and testing JSON-4.10 ... OK
Successfully installed JSON-4.10
2 distributions installed
[root@aabe6178c007 /]#

所以你可以看到你不需要install这个词,运行echo $?返回的代码是1,所以这就是破坏你的构建的步骤。

旁注

  • 如果你运行容器而不改变里面的用户(我们没有看到Dockerfile,所以我不能说),那么sudo包是多余的。
  • 由于您仍然是root用户,而在命令&& sudo cpanm install JSON;中使用sudo安装软件包肯定是多余的。
  • 显然,在cpanm中有一个名为install的虚拟软件包就是为了这种情况。
f4t66c6m

f4t66c6m3#

首先,cpanm不是CentOS中的一个软件包。我建议将安装步骤分解为单独的RUN命令,只是为了维护映像(并查看错误)。

FROM centos:7.9.2009
RUN yum install -y perl sudo perl-App-cpanminus
RUN yum clean all
RUN cpanm install --notest JSON Config::Tiny

其次,没有必要sudocpanm。如果你安装cpanm,我不明白为什么你要通过yum安装Config::Tiny,所以我会用cpanm安装它。
将这些命令分解后会发现实际的错误,因为cpanm不是可以安装在CentOS上的软件包,而是:perl-App-cpanminus

相关问题