在维护docker镜像时,我应该如何处理Perl模块更新?

时间:2016-07-30 13:51:36

标签: perl docker dockerfile cpan

我正在构建一个docker镜像,以便能够运行我们所有的Perl应用程序。这些应用程序需要安装数百个CPAN模块。 docker镜像的完整版本大约需要一个小时才能完成。

完成初始图像后,我不确定如何最好地处理正在进行的更新。

  1. 我们可以在git中保留一个Dockerfile,然后根据需要修改它,并将新版本推送到dockerhub。但是,如果执行构建的人没有所有中间映像,那么添加单个CPAN模块可能是一个非常繁琐的过程,并且可能需要一个小时才能知道新模块是否正确安装。此外,它将再次下载每个CPAN模块,这似乎有点冒险,因为新模块可能会发生重大变化。

  2. 或者,执行构建的人可以提取最新的docker-hub映像,然后以交互方式安装cpan模块,提交构建并将新映像推送到dockerhub。然而,我们只有dockerhub图像,但不是主Dockerfile。

  3. 或者另一种选择是为每个新构建创建一个Dockerfile,它引用之前的dockerhub映像。这看起来过于复杂。

  4. 选项1)似乎错了。我很确定我们不想从基础操作系统重建整个映像只是为了安装一个额外的模块。然而,依赖于没有Dockerfiles的图像似乎也存在风险。

1 个答案:

答案 0 :(得分:2)

您可以在docker镜像上使用底层操作系统的标准模块安装程序。

例如,如果其RedHat然后使用yum并且仅在它们不可用时使用CPAN

FROM centos:centos7
  RUN  yum -y install cpanm gcc perl perl-App-cpanminus perl-Config-Tiny &&  yum clean all
  RUN cpanm install Some::Module; rm -fr root/.cpanm; exit 0

取自here并修改

我会尝试使用实际应用程序使用的基本图像

我还会避免以交互方式处理事务(例如脚本化dockerfile),因为您希望能够在上游依赖关系发生变化时重复构建,而docker hub会为您做这些事情。

EDIT 您可以使用dh-make-perl

将perl模块转换为您自己的包

您可以使用repreproArtifactory的付费解决方案将这些内容加载到您自己的Ubuntu仓库中

当您使用repo作为dockerfile中的源时,可以使用apt-get安装这些。

之前我尝试过类似的事情有一些问题

  • 您的应用无法使用最新版本的模块
  • 依赖性远远超出预期
  • 有些模块不会打包

好处是

  • 您将构建工具(gcc等)从应用服务器中删除
  • 您对自己的依赖关系了解得更多