在维护Docker镜像时,如何处理Perl模块更新?

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

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

  1. 我们可以在git中保留一个Dockerfile,然后根据需要进行修改,并将新的构build推送到dockerhub。 但是,如果构build的人没有全部的中间映像,那么添加一个CPAN模块可能是一个非常单调乏味的过程,他们甚至可能需要一个小时才能知道新模块是否安装正确。 另外,它会再次下载每个CPAN模块,这似乎有点冒险,因为新模块可能会发生突变。

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

  3. 或者,另一个选项是为每个新的构build创build一个Dockerfile,它引用了以前的dockerhub映像。 这似乎过于复杂,但。

选项1)似乎是错误的。 我相当肯定,我们不希望从基本操作系统重build整个映像只是为了安装一个额外的模块。 然而,依赖于没有Dockerfiles的图像似乎也是有风险的。

您可以在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 

从这里采取和修改

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

我也会避免交互式地做事情(例如,编写一个dockerfile),因为当上游依赖关系发生变化时,您希望能够重复构build这个Docker中心为您做的事情。


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

您可以使用reprepro或Artifactory的付费解决scheme将这些加载到您自己的Ubuntu repo中

这些可以使用apt-get来安装,当你使用repo作为dockerfile中的一个源代码时。

以前我曾经尝试过类似的东西有几个问题

  • 您的应用程序不适用于最新版本的模块
  • 有比您预期更多的依赖关系
  • 一些模块不会打包

好处是

  • 您将构build工具(gcc等)保留在应用服务器之外
  • 你更了解你的依赖关系
Interesting Posts