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

use*_*825 5 perl cpan docker dockerfile

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

在完成初始图像后,我不确定如何最好地处理持续更新.

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

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

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

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

Kee*_*yOn 5

您可以在 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
Run Code Online (Sandbox Code Playgroud)

从这里获取并修改

我会尝试拥有实际应用程序使用的基础映像

我还会避免以交互方式执行操作(例如编写 dockerfile 脚本),因为您希望能够在上游依赖项发生变化时重复构建,而 docker hub 会为您做到这一点。


编辑您可以使用dh-make-perl将 perl 模块转换为您自己的包

您可以使用reprepro或Artifactory的付费解决方案将它们加载到您自己的 Ubuntu 存储库中

当您使用存储库作为 dockerfile 中的源时,可以使用 apt-get 安装这些文件。

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

  • 您的应用程序不适用于最新版本的模块
  • 依赖项比您预期的要多得多
  • 有些模块不会打包

好处是

  • 您将构建工具(gcc 等)远离应用程序服务器
  • 您对自己的依赖关系了解得更多