好吧,團隊!我們透過Docker化它,將我們的Go API提升到一個新的水平,更重要的是,透過多階段建置使其輕量級且有效率。讀完本文後,您將擁有一個不僅可移植而且還針對更快部署進行最佳化的 API。 ?
多階段建置使我們能夠透過將建置環境與運行時環境分離來保持最終的Docker映像的精簡。對於 Go 應用程式來說,這特別有用,因為我們可以在一個階段(使用所有必要的工具和依賴項)建立應用程序,然後僅將生成的二進位檔案複製到更小的最終映像中。
多階段建構的好處:
讓我們建立一個利用多階段建置的 Dockerfile。這將幫助我們透過減小最終圖像大小來優化用於生產的 Go API。
在專案的根目錄中建立一個包含以下內容的 Dockerfile:
# Build stage FROM golang:1.21.0-alpine3.17 AS builder WORKDIR /app COPY . . # Install dependencies and build the application RUN go mod download RUN go build -o main . # Run stage (lightweight) FROM alpine:3.18.3 WORKDIR /app # Copy the binary from the builder stage COPY --from=builder /app/main . # Expose the API port EXPOSE 8000 # Run the binary CMD ["/app/main"]
建置階段:
運行時階段:
透過這種方法,我們的最終圖像僅包含運行 API 所需的內容,從而產生明顯更小的圖像。
現在我們已經有了最佳化的 Dockerfile,讓我們建置並執行 Docker 映像。
docker build -t my-go-api .
docker run -p 8000:8000 my-go-api
您應該會看到您的 API 在 http://localhost:8000 上運行,就像在本機上一樣!
為了進一步最佳化,您可以使用scratch 映像取代 Alpine 執行階段。臨時映像完全是空的——沒有作業系統,沒有實用程式——這導致映像尺寸更小。但是,這也意味著您將無法存取容器內的任何偵錯工具。
這是帶有 scratch 映像的 Dockerfile 的樣子:
# Build stage FROM golang:1.21.0-alpine3.17 AS builder WORKDIR /app COPY . . RUN go mod download RUN go build -o main . # Run stage FROM scratch WORKDIR /app COPY --from=builder /app/main . EXPOSE 8000 CMD ["/app/main"]
這種方法可以將您的最終影像大小縮小到10-15MB!但是,請記住,使用 scrap 最適合非常基本的獨立應用程式。
讓我們測試我們的容器以確保它按預期工作:
curl http://localhost:8000/books
如果您的 API 回應正確,那麼恭喜!您已成功使用 Docker 優化並容器化了您的 Go API。 ?
現在您的 API 已支援 Docker 並針對生產進行了最佳化,您已經做好了順利部署和擴展的準備!下次,我們將換檔並深入研究 Go 的單元測試,確保您的 API 不僅可部署,而且堅如磐石。 ??
此外,請關注我的 ThrottleX GitHub 存儲庫以獲取更新 - 我很快就會發布有關集成自訂速率限制器的教程!
以上是透過多階段建立 Docker 化您的 Go API的詳細內容。更多資訊請關注PHP中文網其他相關文章!