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

How should I handle Perl module updates when maintaining docker images?

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

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

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

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

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

选项 1) 似乎是错误的。我很确定我们不想从基础 OS 重建整个图像只是为了安装一个额外的模块。然而,依赖没有 Dockerfiles 的图像似乎也有风险。

您可以在 docker 图像上为您的底层 OS 使用标准模块安装程序。

例如,如果它的 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并修改

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

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


编辑 您可以使用 dh-make-perl

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

您可以使用 reprepro or a paid solution of Artifactory

将它们加载到您自己的 Ubuntu 存储库中

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

当我之前尝试过类似的东西时,有一些问题

  • 您的应用无法使用最新版本的模块
  • 依赖项比您预期的要多得多
  • 有些模块不会打包

好处是

  • 您让构建工具(gcc 等)远离应用程序服务器
  • 你更了解你的依赖关系