2016-04-29 75 views
2

由於Docker Hub上的build time restrictions,我決定將耗時的自動構建的Dockerfile拆分爲3個文件。 這些「子版本」中的每一個都在Docker Hub的時間限制內完成。在同一個Docker Hub存儲庫中鏈式自動構建

我現在同一個版本庫中的以下設置:

| branch | dockerfile   | tag | 
| ------ | ------------------ | ------ | 
| master | /step-1.Dockerfile | step-1 | 
| master | /step-2.Dockerfile | step-2 | 
| master | /step-3.Dockerfile | step-3 | 

的圖像按以下順序互爲基礎:

  • step-1.DockerfileFROM ubuntu
  • step-2.DockerfileFROM me/complex-image:step-1
  • step-3.DockerfileFROM me/complex-image:step-2

一個單獨的web應用程序使用Docker Hub提供的「構建觸發器」URL觸發構建step-1。 (其中添加了{"docker_tag": "step-1"}'負載)但是,Docker Hub不提供自動觸發step-2,然後step-3後綴的方法。

問:如何自動按照各自的順序觸發以下構建步驟?(即觸發step-2step-1完成之後,觸發step-3step-2結束)

注:我不想爲每個step-i然後使用泊塢集線器的連接它們設置不同的版本庫「庫鏈接。」我只是想鏈接標籤在同一回購協議。

注意:到現在爲止,我的解決方案是將Docker Hub Webhook連接到我製作的Web應用程序。當step-n完成時(即使用包含標記名稱step-n的JSON調用我的Web應用程序的URL),Web應用程序使用「構建觸發器」觸發step-n+1。它按預期工作,但是,我想知道是否有一種「更好」的做事方式。

編輯:As requested by Ken Cochrane這裏是initial Dockerfile以及它所使用的"build script"。我只是試圖dockerize Cling。 (一個C++解釋器)它需要編譯llvm,clang和cling。正如你所期望的,根據不同的機器上,它需要幾個小時的話,和泊塢樞紐允許「只」 2小時建立在最:)我在develop分支後來添加的(仍然是「子建」圖像)分別構建整個事物的一部分。我不確定這裏是否有進一步的優化。

此外,爲了測試各種想法(和避免等待H-小時的結果)我有安裝another repo具有類似的結構。(唯一的區別是,它的Dockerfile■不要做盡可能多的工作)

更新1:Option 5:如預期,從step-1.Dockerfilecurl已被忽略:

Settings > Build Triggers > Last 10 Trigger Logs 

| Date/Time     | IP Address  | Status | Status Description  | Request Body    | Build Request | 
| ------------------------- | --------------- | ------- | ------------------------ | -------------------------- | ------------- | 
| April 30th, 2016, 1:18 am | <my.ip.v4.addr> | ignored | Ignored, build throttle. | {u'docker_tag': u'step-2'} | null   | 

另一個問題這種方法是,它要求我把構建觸發的(祕密)令牌在Dockerfile給大家看看:)(希望,多克爾中心有一個選項,以使它無效並重新生成另一個)

更新2:這裏是my current attempt: 它基本上是一個Heroku -hosted的應用程序,具有APScheduler週期性「觸發」啓動該初始構建步驟和Flask網絡掛接處理程序「傳播」構建。 (即它有構建標籤的有序列表,每次被webhook調用時,它會觸發下一個構建步驟),我將在業餘時間繼續完成這個工作。 (歡迎提出建議:))

+0

忘記了觸發標記。您應該能夠從構建觸發器頁面重新生成一個新的。 –

+0

我認爲你的用例是唯一的,所以你的自定義web應用程序來處理它,是最好的選擇。隨時接上github並鏈接到它,以便其他人可以查看並提供反饋。不要擔心成爲初學者,我們都開始在某個地方:) –

回答

1

構建需要多長時間?你可以發佈你的Dockerfile嗎?

選項1:找出自動化構建需要花費很長時間以查看爲什麼它不能及時完成。如果你在這裏發佈,我們可以看看你有什麼可以做的優化。

選項2:您現在正在做什麼,使用第三方應用程序以給定順序觸發構建。選項3:我不確定這是否適用於您,因爲您使用的是相同的回購協議,但通常您會使用此功能的回購鏈接,然後鏈接它們,當一個完成後,下一個觸發第一個。但既然你有一個回購,它將無法正常工作。

選項4:分解成多個回購,然後您可以使用回購鏈接。選項5:完全破解,最後的手段(不知道它是否會起作用)。你在Dockerfile的最後一行添加一個CURL語句,用下一步的給定標籤發佈到repo的構建觸發器鏈接。如果下一步需要一個標籤,則可能需要在下一步中添加休眠以等待推送完成推送到集線器。

老實說,最好的選擇之一就是:你在做什麼都應該能夠在指定的時間內完成,你可能正在做一些我們可以優化的事情來使整個事情變得更快。如果你在規定的時間內進入,那麼其他一切都不需要。

+0

感謝您的建議!我剛剛在我的問題中添加了相關鏈接。正如您將會發現的那樣,由於構建必須編譯相當大的C/C++代碼庫,因此沒有太多需要優化的地方。如果選項2是可行的(即不被認爲「太難看」),我可能會清理應用程序代碼並將其放在github上。但我也想知道是否已經有類似/更好的產品。 (即由Docker專家而不是像我這樣的初學者製作)正如我在我的帖子中所述,我不想使用選項3和/或4. – 865719

+0

我喜歡選項5 :)但由於Docker Hub的限制,我認爲觸發器將被忽略(_「...建立請求被扼殺,以便它們不會使系統超載......」__(我將繼續嘗試並返回給您) – 865719

+0

您可以在原始文章中查看我對選項5的更新,正如預期的那樣,它不起作用(另外,它暴露了'Dockerfile'中的祕密標記) – 865719

1

最近不得不依賴鏈的構建同樣的要求,並取得其使用泊塢雲自動化這種方式建立:

  • 創建爲需要構建的每個Dockerfile構建規則庫。
  • 禁用依賴存儲庫中所有構建規則的Autobuild選項。
  • 添加一個名爲每個目錄hooks\post_push包含shell腳本Dockerfile與下面的代碼有家屬:

    for url in $(echo $BUILD_TRIGGERS | sed "s/,/ /g"); do 
        curl -X POST -H "Content-Type: application/json" --data "{ \"build\": true, \"source_name\": \"$SOURCE_BRANCH\" }" $url 
    done 
    
  • 每個倉庫與家屬添加一個名爲BUILD_TRIGGERS到自動構建Build Environment Variable,並設置Value添加到每個依賴自動構建的構建觸發器URL的逗號分隔列表。

使用該設置一推到源庫將觸發圖像的生成,一旦它完成與被按下的post_push鉤將被執行。在鉤子中,對每個依賴的存儲庫構建觸發器進行POST,其中包含正在請求主體中構建的分支或標記的名稱。這將導致觸發相關存儲庫的適當構建規則。

0

可以通過調整Docker Hub存儲庫中的Build Settings來完成此操作。

首先,爲您的GitHub存儲庫的/step-1.Dockerfile創建自動構建,標記爲step-1。這一個不需要任何特殊設置。

接下來,爲您的GitHub存儲庫的/step-2.Dockerfile創建另一個自動構建,標記爲step-2。在構建設置中,取消選中當激活時,構建將在推動時自動發生。還要添加一個存儲庫鏈接到me/step-1

step-3做相同的操作(將其鏈接到me/step-2)。

現在,當您推送到GitHub存儲庫時,它將觸發步驟1來構建;當完成時,步驟2將建立,然後,步驟3將建立。

請注意,您需要等待上一階段成功構建一次,然後才能向其添加存儲庫鏈接。

相關問題