這是很簡單的Go的程序。它首先會引入兩個包,一個是官方包,一個是外部包,它需要包管理依賴工具來引用到。這個數(shù)主函數(shù),它做的就是先建一個http,然后通過官方里的App功能把這個啟動起來,然后在1234端口打開。可以看到這個程序沒做太多事情,主要演示的就是包工具管理依賴的事情。
這是做的第一次嘗試,可以看到這個目錄結(jié)構(gòu)是這樣的,這個是按照Go的官方習(xí)慣的編寫方式,會把文件放在叫做src下面,hello可以看作一個是項目表,main就是文件。
這個是剛才目錄里的Dockerfile。它首先引用了一個Golang,這個是Docker官方提供的,它除了提供這個還提供其他語言的,Java都有。它做的事情很簡單,首先把src目錄加到main里,然后拉去hello模塊里的依賴。從Golang,當(dāng)把src目錄加進去之后就會把它作為Golang執(zhí)行時的目錄。這里不用把前面的前綴都寫,只需要寫在Src目錄下面的名就可以了,就是hello。
優(yōu)缺點
•優(yōu)點:同步更新項目依賴;結(jié)構(gòu)簡單,容易維護。
•缺點:無法對依賴做Cache,編譯耗時;不同項目之間重新編譯依賴。
第二次嘗試,這個結(jié)構(gòu)跟剛才一樣,這里和剛才有一個最大的區(qū)別,它就是說把剛才的依賴包直接手寫到了Docker文件里,而且這個依賴包會寫在,把src加入到整個Docker的地址之前,就是每次先執(zhí)行這句話,然后再把所有的原密碼上傳設(shè)置。這個好處就是在于這句話執(zhí)行與否與互相間的修改不相關(guān)的。如果你重復(fù)執(zhí)行Dockerfile,可以在這里面直接Cache,這句話只要在第一次運行一遍直接走到下面,這就會增加編譯的速度。如果想更新這個包的話,可以減Cache命令,它就會重新拉取依賴,這個依賴就是一個可以被Cache目標。
優(yōu)缺點
•優(yōu)點:依賴會被Cache,提高速度;結(jié)構(gòu)簡單,容易維護。
•缺點:手寫依賴,不能同步更新項目的變化;不同項目之間重新編譯依賴。
第三次嘗試,這個可以看到整個目錄結(jié)構(gòu)開始變得比較復(fù)雜了,首先最大不同就是編譯變成了兩個腳本。Dockerfile沒有變,在src會出現(xiàn)一個github.com。Dockerfile只是直接把一個hello拷到了Docker里,而沒有做其他的事情。
優(yōu)缺點
•優(yōu)點:依賴會被保存在本地,提高速度;依賴同步更新。
•缺點:不同編譯環(huán)境保存的依賴可能不一致;依賴侵入項目,造成干擾;gitignore,但是很麻煩。
使用Docker進行構(gòu)建
這是我們現(xiàn)在在使用的一些方法,是我們最終在使用的。首先可以從目錄結(jié)構(gòu)來看,它會比剛才第三種方法變得更加復(fù)雜,首先它會有兩個編譯的腳本,這個應(yīng)該是build sh.sh,hello.sh,我們寫程序的時候知道,如果有問題的話可以單獨抽象出一層來解決問題,這個就是把一個基礎(chǔ)的依賴和真正構(gòu)建程序的Docker分成兩個Docker,base這層是在做依賴,而hello會基于base做構(gòu)建。
這個是來介紹base Image,它所做的事情首先是起名字,同時會指定。下面這個Dockerfile就是base,它做的就是從Golang程序里作為一個基礎(chǔ)隱秘,把src加入進去,這是Go的一個配置方法,相當(dāng)于它會拉取所有項目依賴。這樣做完以后歸做base Image有項目所有依賴的包。
這是整個項目的所有依賴,這里hello.sh是構(gòu)建項目的腳本,它跟剛才的最大區(qū)別是它構(gòu)建的配置文件發(fā)生了變化,這是指定了一個hello的名字。而下面是hello的Cache文件。這個地方會發(fā)現(xiàn),把src重新加入到image,這樣做就是當(dāng)hello image有變化的時候,它還是需要重新覆蓋到image。
優(yōu)缺點
•優(yōu)點:依賴會被Cache在本地,提高速度;依賴同步更新;依賴可以被多個項目共享。
•缺點:多維護一個image。