好吧,团队!我们通过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中文网其他相关文章!