2016-12-04 126 views
-2

我想在Docker鏡像構建期間構建我的Go應用程序,並將圖像入口點設置爲構建的Go應用程序。問題是我的Go應用程序是主包的子包,並使用主包中的其他子模塊。這個主包在Github上作爲私有存儲庫,所以我不能只在容器內部使用go get解決Docker容器中的Go依賴關係

我試着設置Glide依賴關係管理器,並將容器外的所有依賴關係獲取到vendor/目錄中,但還有另一個問題 - glide.lock在主私有存儲庫中的每次提交後都必須更新。這對我來說不是解決方案,因爲我想鎖定其他依賴關係。

有沒有什麼辦法用最新版本的主包依賴項和其他依賴項的鎖定版本來構建應用程序?

+0

https://blog.golang.org/docker這裏是包裝碼頭集裝箱的好文章。您可以在DockerFile中定義應用程序的所有必需的子包和入口點 – ahankendi

+0

由於需要手動克隆到GOPATH或使用支持ssh的glide的私有存儲庫,因此這不起作用。另外我需要依賴版本鎖定。 – kubaj

回答

0

這不是一個Go問題。這是一個Docker和安全問題。

首先,它並不是構建Go應用程序的一部分。通常情況下,您會在您設置的Dockerfile FROM的機器上建立二進制文件。沒有理由不這樣做,因爲每臺機器都有一個Go編譯器,您可以將GOOS和GOARCH作爲目標機器。

但是對於您的用例,使用私人回購,更重要的是不要在您的容器內部構建,因爲無論您如何將代碼放入要構建的容器中,您的容器都將包含私有文件或更糟你的ssh密鑰。一個容器,您必須上傳並託管並在某處運行。

不過你看它並不理想。

但是,如果你有決心會泄露你的代碼和/或鑰匙,你只有兩種選擇:

  • git clone在本地/構建機器yhat私人回購協議被授權訪問私人回購協議並在你的Dockerfile中使用COPY來複制它。

  • 使用Dockerfile COPY將您已授權用於遠程回購的本地計算機的SSH密鑰複製到容器中,以便您可以運行git命令(您還需要安裝git和ssh)。

再次,這些都不理想。在本地構建Go應用程序,定位容器的類型,然後複製二進制文件。這真的不容易。

至於依賴管理,我從來沒有用過滑翔;但是,我寫了一個關於/vendor版本依賴關係的流行答案。

How should I use vendor in Go 1.6?

0

如果你只關心能夠從泊塢窗容器go get您的私人回購協議,不介意複製構建時你id_rsa,你可以添加到您的Dockerfile的開頭:

RUN echo "[url \"[email protected]:\"]\n\tinsteadOf = https://github.com/" >> /root/.gitconfig 
RUN mkdir /root/.ssh && echo "StrictHostKeyChecking no " > /root/.ssh/config 
COPY id_rsa /root/.ssh/id_rsa