首页  >  文章  >  后端开发  >  通过多阶段构建 Docker 化您的 Go API

通过多阶段构建 Docker 化您的 Go API

Barbara Streisand
Barbara Streisand原创
2024-10-08 06:30:02932浏览

Dockerizing Your Go API with Multi-Stage Builds

好吧,团队!我们通过Docker化它,将我们的Go API提升到一个新的水平,更重要的是,通过多阶段构建使其轻量级且高效。读完本文后,您将拥有一个不仅可移植而且还针对更快部署进行优化的 API。 ?

为什么要进行多阶段构建? ?

多阶段构建使我们能够通过将构建环境与运行时环境分离来保持最终的Docker镜像的精简。对于 Go 应用程序来说,这特别有用,因为我们可以在一个阶段(使用所有必要的工具和依赖项)构建应用程序,然后仅将生成的二进制文件复制到更小的最终映像中。

多阶段构建的好处

  • 较小的图像大小:通过剥离不必要的构建依赖项,我们最终得到的图像只是大小的一小部分。
  • 更快的部署:较小的映像意味着更快的下载和部署。
  • 减少攻击面:运行时环境中的组件越少,意味着潜在的漏洞就越少。

第 1 步:使用多阶段构建编写 Dockerfile

让我们创建一个利用多阶段构建的 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"]


Dockerfile 的详细信息:

  1. 构建阶段

    • 我们从官方 Go Alpine 镜像开始,它比标准 Go 镜像小。
    • 所有依赖项均已下载,然后我们使用 go build 将应用程序编译为二进制文件(主)。
  2. 运行时阶段:

    • 我们切换到更轻的 Alpine 镜像,它不包含 Go 编译器或其他构建依赖项。
    • 编译后的二进制文件是从构建器阶段复制过来的,我们公开端口 8000 以允许访问我们的 API。

通过这种方法,我们的最终图像仅包含运行 API 所需的内容,从而产生明显更小的图像


第 2 步:构建并运行 Docker 容器

现在我们已经有了优化的 Dockerfile,让我们构建并运行 Docker 镜像。

  1. 构建 Docker 镜像:

   docker build -t my-go-api .


  1. 运行 Docker 容器:

   docker run -p 8000:8000 my-go-api


您应该看到您的 API 在 http://localhost:8000 上运行,就像在本地计算机上一样!


第 3 步:使用暂存图像进一步优化(可选)

为了进一步优化,您可以使用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 最适合非常基本的独立应用程序。


第 4 步:测试优化后的容器?

让我们测试我们的容器以确保它按预期工作:


curl http://localhost:8000/books


如果您的 API 响应正确,那么恭喜!您已成功使用 Docker 优化并容器化了您的 Go API。 ?

生产中多阶段构建的好处

  • 高效部署:较小的镜像意味着更快的拉取时间,这在生产环境中至关重要。
  • 节省资源:通过减少存储和内存占用,您的基础设施成本保持较低。
  • 安全性:最终映像中较少的组件减少了潜在的漏洞。

接下来是什么?

现在您的 API 已支持 Docker 并针对生产进行了优化,您已经做好了顺利部署和扩展的准备!下次,我们将换档并深入研究 Go 的单元测试,确保您的 API 不仅可部署,而且坚如磐石。 ??

此外,请关注我的 ThrottleX GitHub 存储库以获取更新 - 我很快就会发布有关集成自定义速率限制器的教程!

以上是通过多阶段构建 Docker 化您的 Go API的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn