perl - 维护 docker 镜像时应该如何处理 Perl 模块更新?

标签 perl docker dockerfile cpan

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

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

  • 我们可以在 git 中保留一个 Dockerfile,然后根据需要对其进行修改,并将新构建推送到 dockerhub。但是,如果进行构建的人没有所有中间图像,那么添加单个 CPAN 模块可能是一个极其繁琐的过程,并且他们甚至可能需要一个小时才能知道新模块是否正确安装。此外,它还会再次下载每个 CPAN 模块,这似乎有点冒险,因为新模块中可能存在重大变化。
  • 或者,进行构建的人可以拉取最新的 docker-hub 镜像,然后以交互方式安装 cpan 模块,提交构建并将新镜像推送到 dockerhub。然而,我们只有我们的 dockerhub 镜像,但没有主 Dockerfile。
  • 或者另一种选择是为每个新构建创建一个 Dockerfile,它引用以前的 dockerhub 镜像。不过,这似乎过于复杂。

  • 选项 1) 似乎是错误的。我相当确定我们不想仅仅为了安装一个附加模块而从基本操作系统重建整个镜像。然而,依赖没有 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
    

    取自 here并修改

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

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

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

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

    然后,当您将 repo 用作 dockerfile 中的源时,可以使用 apt-get 安装它们。

    当我之前尝试过类似的事情时有一些问题
  • 您的应用程序不适用于最新版本的模块
  • 依赖项比您预期的要多得多
  • 部分模块不打包

  • 好处是
  • 您将构建工具(gcc 等)远离应用服务器
  • 您对依赖项了解更多
  • 关于perl - 维护 docker 镜像时应该如何处理 Perl 模块更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38674674/

    相关文章:

    perl - 从 UI 访问远程计算机时无法通过 shell 脚本 ssh 到远程计算机

    django - 使用 Docker 部署 Django 应用

    shell - 通过环境传递 bash 代码(用于 docker-compose)

    node.js - 容器化时 NodeJS 应用程序停止工作 [容器中的 FTP 服务器]

    docker - 如何使用 docker cp 从主机 rsync 到 docker 容器

    bash - Docker 下载并安装二进制文件

    perl - 使用 Perl 调用 protected Windows 7 可执行文件

    bash - 包含通过函数初始化传递的变量插入 perl 字符串的 bash 变量的函数

    python - 我应该使用 Perl 还是 Python 进行网络监控?

    php - 在 PHP 5.2.x 中使用 Docker 环境变量