2016-07-30 76 views
5

我正在建設一個碼頭工人形象能夠運行所有的我們的Perl應用程序。這些應用程序需要安裝數百個CPAN模塊。碼頭圖像的完整版本需要大約一個小時才能完成。維護docker映像時應如何處理Perl模塊更新?

做初始圖像後,我不知道如何最好地處理持續更新。

  1. 我們可以保持一個Dockerfile在Git中,然後修改這個要求,並推新版本多達dockerhub。但是,如果這樣做構建的人沒有所有的中間圖像,然後添加一個CPAN模塊可以是一個非常繁瑣的過程,它可能需要一個小時之前,他們甚至知道,如果新的模塊正確安裝。此外,它會再次下載每個CPAN模塊,這似乎有點冒險,因爲新模塊可能會發生突變。

  2. 或者,進行構建的人可以拉取最新的docker-hub映像,然後以交互方式安裝cpan模塊,提交構建並將新映像推送到dockerhub。不過,我們只有我們的dockerhub圖像,但不是主要的Dockerfile。

  3. 或者另一種選擇是創建一個Dockerfile爲每一個新的構建,它引用先前dockerhub圖像。這似乎過於複雜,但。

選項1)似乎是錯誤的。我相當肯定,我們不希望從基本操作系統重建整個映像,只安裝一個附加模塊。然而,依賴於沒有Dockerfiles的圖片似乎也有風險。

+0

選擇3或一些變種似乎最「泊塢窗,適當」的解決方案。如果您遵循有組織的標記策略,用戶「升級」到最新版本將能夠利用先前的圖像層,並且只需要構建最新版本。您可能需要創建一個名稱不同的「基礎」版本,以避免在完全重新構建時需要進行完整構建。 – ldg

回答

1

你可以使用標準的模塊安裝程序爲您泊塢窗圖片上的底層操作系統。

舉例來說,如果它的紅帽然後用yum和只使用CPAN當他們無法從here採取和修改

我會嘗試有一個基本映像

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),你希望能夠重複建設時,上游的依賴關係發生變化,這泊塢窗中心爲你做。


編輯 可以使用轉換Perl模塊到您自己的包dh-make-perl

您可以將這些加載到使用reprepro自己的Ubuntu回購或Artifactory

這些付費解決方案然後可以安裝當您使用repo作爲dockerfile內的源時,使用apt-get。

當我已經嘗試了類似的事情之前,有幾個問題

  • 您的應用程序不與模塊的最新版本的工作
  • 還有更加依賴比你預期的
  • 一些模塊慣於打包

好處是

  • 你保持製作工具(GCC等)關閉應用服務器
  • 你知道更多關於你的依賴
+0

是的,當我找到它們時,我一直在使用官方軟件包。我對Ubuntu最熟悉,所以一直使用apt-get。我一直在想,如果使用官方的perl docker base,以及已知可以與我們的應用程序一起工作的特定perl版本會更安全。麻煩的是它似乎忽略了apt-get封裝的庫。 – user1751825

+0

不幸的是,我們需要相當多的模塊,這些模塊並沒有在官方的os軟件包中使用。 – user1751825

+0

我見過的另一個選項是使用類似local :: lib的東西,然後在運行相同的os和perl的構建實例上安裝所有必需的模塊,然後手動打包和部署整個lib文件夾。這將提供什麼好處,從模塊創建單個包? – user1751825