2017-08-16 48 views
2

對我來說,有一個選項可以使用FROM scratch,它看起來像是一個非常有吸引力的構建Go容器的方法。默認情況下,Docker scratch包含哪些內容?

我的問題是,它仍然有本地運行二進制文件,我需要添加任何東西,以便可靠地運行Go二進制文件?編譯Go二進制似乎至少在我的筆記本電腦上運行它。

我的目標是爲了安全和基礎管理的原因保持圖像尺寸最小。在最佳情況下,我的容器將無法在構建階段之外執行二進制文件或shell命令。

回答

5

劃痕圖像不包含任何內容。沒有文件。但實際上,這可以發揮你的優勢。事實證明,使用CGO_ENABLED=0構建的Go二進制文件除了要使用的內容外,完全不需要任何內容​​。有幾件事要記住:

  • CGO_ENABLED=0,你不能使用任何C代碼。其實不太難。
  • 由於CGO_ENABLED=0,您的應用程序不會使用系統DNS解析器。我認爲它不會默認使用,因爲它是阻塞的,Go的本地DNS解析器是非阻塞的。
  • 您的應用程序可能會依賴於某些事情是不存在的:
    • 應用,使HTTPS調用(如,其他服務,如亞馬遜S3,或條紋API)將需要CA-證書,以確認HTTPS證書的真實性。這也必須隨着時間的推移而更新。這不是服務HTTPS內容所必需的。
    • 需要時區知曉的應用程序需要時區信息文件。

一個不錯的選擇,FROM scratchFROM alpine,其中將包括基本的阿爾卑斯山的形象 - 這是非常微小(5 MIB我相信),包括MUSL的libc,這與圍棋兼容,並且可以讓你鏈接到C庫以及編譯時不需要設置CGO_ENABLED=0。您還可以利用alpine定期更新的事實,使用它的tzinfo和ca-certs。 (值得注意的是,由於Docker的重複數據刪除技術,Docker圖層的開銷已經稍微增加了一些,儘管當然這會被基本圖像的更新頻率所抵消,但它有助於推銷使用相當小的想法高山形象。)

您現在可能不需要tzinfo或ca-certs,但最好是安全而不是抱歉;您可能會意外添加依賴項而不會意識到它打破了您的構建。所以我建議使用alpine作爲您的基地。 alpine:latest應該沒問題。獎勵:如果您希望Docker內部具有可重複構建的優勢,但圖像尺寸較小,則可以使用Docker 17.06+中提供的新Docker多階段構建。

它的工作原理有點像這樣:

FROM golang:alpine 
ADD . /go/src/github.com/some/gorepo # may need some go getting if you don't vendor 
RUN go build -o /app github.com/some/gorepo 

FROM scratch # or alpine 
COPY --from=0 /app /app 
ENTRYPOINT ["/app"] 

(我道歉,如果我犯了任何錯誤,我打字,從內存。)

注意,使用FROM scratch時必須使用的ENTRYPOINT的EXEC形式,因爲殼的形式是不行的(這取決於有/bin/sh,泊塢窗圖像上,它不會。)這將在阿爾卑斯正常工作。

+0

非常感謝,約翰!很好的解釋,特別是你對證書的暗示,我很確定我將來需要他們。 –

相關問題