小容器挑戰:將一個HTTP伺服器Dcoker從943M壓縮到6k! | devopsdirective

發表於2021-04-25

本文展示如何將Node.js的Image大小從最初的943MB縮小到6.34kB Assembly Image的過程,並瞭解了一些可用於將來縮小容器映象的技術。

Docker具有稱為多階段構建的功能,可輕鬆在具有所有必要依賴項的環境中構建程式碼,然後將生成的可執行檔案複製到其他Image中。出於多種原因,這很有用,但是最明顯的原因之一是Image大小!通過如下方式重構dockerfile:

### build stage ###
FROM golang:1.14-alpine AS builder
COPY . .
RUN go build -o server .

### run stage ###
FROM alpine:3.12
COPY --from=builder /go/server ./server
COPY index.html index.html
CMD ["./server"]

Image結果就是13.2MB!

 

靜態編譯+Scratch image

13 MB還算不錯,但是我們仍然可以使用一些技巧來使它變得更小。

有一個稱為scratch的基本Image,其內容為空且大小為零。因為scratch裡面沒有任何內容,所以使用它構建的任何Image都必須帶有所有必需的依賴項。

為了使基於go的伺服器能夠做到這一點,我們需要在編譯步驟中新增一些標誌,以確保將必要的庫靜態連結到可執行檔案中:

### build stage ###
FROM golang:1.14 as builder
COPY . .
RUN go build \
  -ldflags "-linkmode external -extldflags -static" \
  -a server.go

### run stage ###
FROM scratch
COPY --from=builder /go/server ./server
COPY index.html index.html
CMD ["./server"]

具體來說,我們將連結模式設定為external,並將-static標誌傳遞給外部連結器。

這兩個更改使Image大小達到8.65MB

 

ASM贏!

用Go之類的語言編寫的小於10MB的影像幾乎在任何情況下都足夠小...但是我們可以縮小尺寸!Github使用者nemasu在github上以彙編形式編寫的全功能http伺服器,名為assmttpd

對其進行容器化所需要做的就是在執行提供的make release配方之前將一些構建依賴項安裝到ubuntu基礎Image中:

### build stage ###
FROM ubuntu:18.04 as builder
RUN apt update
RUN apt install -y make yasm as31 nasm binutils 
COPY . .
RUN make release

### run stage ###
FROM scratch
COPY --from=builder /asmttpd /asmttpd
COPY /web_root/index.html /web_root/index.html
CMD ["/asmttpd", "/web_root", "8080"

asmttpd然後將生成的可執行檔案複製到 scratch image中,並使用呼叫CMD。這樣產生的影像大小僅為6.34kB!

點選標題

相關文章