在维护Docker镜像时,如何处理Perl模块更新?
我正在构build一个docker镜像,以便能够运行我们所有的Perl应用程序。 应用程序需要安装数百个CPAN模块。 docker图像的完整版本需要大约一个小时才能完成。
做完初始图像之后,我不确定如何最好地处理正在进行的更新。
-
我们可以在git中保留一个Dockerfile,然后根据需要进行修改,并将新的构build推送到dockerhub。 但是,如果构build的人没有全部的中间映像,那么添加一个CPAN模块可能是一个非常单调乏味的过程,他们甚至可能需要一个小时才能知道新模块是否安装正确。 另外,它会再次下载每个CPAN模块,这似乎有点冒险,因为新模块可能会发生突变。
-
或者,进行构build的人可以拖动最新的docker-hub镜像,然后以交互方式安装cpan模块,提交构build并将新镜像推送到dockerhub。 但是,我们只有我们的dockerhub图像,但不是主要的Dockerfile。
-
或者,另一个选项是为每个新的构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等)保留在应用服务器之外
- 你更了解你的依赖关系