搜索
首页后端开发GolangGo (Golang) 的 Docker 镜像 更小、更快的 Docker 镜像和安全性

周末期间,我对专门用于 Go (Golang) 应用程序的 docker 镜像进行了一些研究。因此,我想分享这些有趣的发现,因为这可能对那些在技术项目中探索相同内容的人有用。

在这里,我将详细阐述我们为 Golang 构建镜像的几种不同方法,并强调我们在选择一种方法时需要考虑的一些安全注意事项。

在本练习中,我使用了一个简单的 Rest API,该 API 使用 Go (Golang) 和 Gin 框架开发。

Gin 框架 是一个流行的 Go (Golang) Web 框架,旨在快速、易于使用且高效。
 
以下是其主要功能和特性的简要摘要;

主要功能

  • 性能:杜松子酒以其高性能而闻名。它是最快的 Go Web 框架之一,与其他框架相比,提供了最小的开销。

  • 快速 HTTP 路由器:Gin 使用快速 HTTP 路由器,支持 GET、POST、PUT、DELETE 等方法的路由,还支持中间件和路由分组。

  • 中间件支持:Gin 提供了一种使用中间件来处理日志、身份验证以及其他请求的预处理或后处理等任务的方法。

  • JSON 验证: 该框架提供了对 JSON 验证和将请求数据绑定到 Go 结构的内置支持,使使用 JSON 有效负载变得更加容易。

  • 错误处理:Gin 具有结构化的错误处理方式,并提供中央错误管理系统,让您能够优雅地处理错误。

  • 模板渲染:虽然 Gin 主要是为 API 开发而设计的,但如果需要,它也支持 HTML 模板渲染。

  • 请求处理:支持不同的请求处理方法,包括表单数据、JSON 负载和 URL 参数。

  • 内置调试:Gin 提供了在开发过程中有用的详细错误消息和调试信息。

关键部件

  • 路由器:处理 HTTP 请求路由到适当处理程序的核心组件。

  • 上下文: 承载请求和响应数据的结构,以及
    提供了处理它们的方法。它在处理程序中广泛使用。

  • 引擎: Gin 应用程序的主实例,配置了路由、中间件和其他设置。

  • 中间件:在请求生命周期中执行的函数,允许您执行日志记录、身份验证等任务

关于 Gin 框架的介绍已经足够了:)现在让我们进入主题并讨论所进行的测试。

测试 1(常规 Docker 构建)

在此测试中,我们将使用官方标准/常规 Go 基础镜像

# Official Go Base Image
FROM golang:1.21.0

# Create The Application Working Directory
WORKDIR /app

# Copy and Download Dependencies
COPY go.mod go.sum .
RUN go mod download

# Copy Source and Build The Application
COPY . .
RUN go build -o main .

# Expose The Port
EXPOSE 8081
CMD ["./main"]

图像尺寸

Docker Images for Go (Golang) Small, Faster Docker Images and Security


测试 2(使用 Alpine 映像进行多阶段 Docker 构建)

在此测试中,我们将使用稍微轻量级的 Go 基础镜像的 Alpine 版本

# Official Go Apline Base Image
FROM golang:1.21.0-alpine as builder

# Create The Application Directory
WORKDIR /app

# Copy and Download Dependencies
COPY go.mod go.sum .
RUN go mod download

# Copy The Application Source & Build
COPY . .
RUN go build -o main .

# Final Image Creation Stage
FROM alpine:3.19

WORKDIR /root/

# Copy The Built Binary
COPY --from=builder /app/main .

# Expose the port
EXPOSE 8081
CMD ["./main"]

图像尺寸
Docker Images for Go (Golang) Small, Faster Docker Images and Security

在这里您可以看到,通过多阶段构建,图像大小显着减小。


测试 3(无 Distroless 构建)

在此测试中,我们将使用 Google 的 Distroless Go 基础映像。 Distroless 映像以轻量级且安全而闻名,仅包含所需的最少文件。在此,这些调试 shell 和不必要的包被删除。因此,您牺牲了包管理器和 shell 的灵活性。

# Build Stage
FROM golang:1.21.0 as builder

# Set The Application Directory
WORKDIR /app

# Copy and Download Dependencies
COPY go.mod go.sum .
RUN go mod download

# Copy The Application Source and Build the application
COPY . .
RUN CGO_ENABLED=0 go build -o main .

# Final Image Creation Stage
FROM gcr.io/distroless/static-debian12

# Copy the built binary
COPY --from=builder /app/main /
CMD ["/main"]

图像尺寸
Docker Images for Go (Golang) Small, Faster Docker Images and Security


CGO_ENABLED=0: 这是禁用 CGO (C-Go) 的环境变量设置。 CGO 是 Go 的一项功能,允许 Go 包调用 C 代码。设置 CGO_ENABLED=0 可确保构建不依赖于任何 C 库,从而生成完全静态的二进制文件。这对于创建可以在任何系统上运行而无需额外依赖项的轻量级和可移植的 Go 二进制文件非常有用。

总而言之,RUN CGO_ENABLED=0 go build -o main . 意味着 Docker 将执行命令在当前目录中构建 Go 应用程序,生成一个名为 main 的静态二进制文件,该二进制文件不会依赖于任何 C 库。

概括

图像尺寸
Docker Images for Go (Golang) Small, Faster Docker Images and Security

尽管 Distroless 映像比 alpine 映像稍大,但出于安全威胁/漏洞考虑,可能会迫使您选择 Distroless!。因此,请考虑所有这些事实并选择符合您要求的一个

采用多阶段构建的 Alpine 如果您需要对构建过程进行更多控制,并且不存在与 musl libc 的兼容性问题,那么

Alpine 是一个不错的选择一个担忧。它提供了灵活性,并且比许多其他基础映像更小,但仍然包含比 Distroless 映像更多的组件,这可能会导致潜在的安全漏洞/威胁。

Google Distroless Images

是最大化安全性和最小化攻击面的理想选择。它们提供了一个非常小的运行时环境,这对于优先考虑安全性的生产系统来说是有益的。但是,您牺牲了包管理器和 shell 的灵活性。

推荐: 如果您需要灵活性和对构建环境的控制,并且与 musl libc

的兼容性问题不是问题,请使用 Alpine

如果安全性和最小化攻击面是您的首要任务,请使用 Google Distroless

,并且您可以确保您的应用程序正确捆绑了所有依赖项。 希望这很有趣,谢谢您的宝贵时间!

以上是Go (Golang) 的 Docker 镜像 更小、更快的 Docker 镜像和安全性的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Golang vs. Python:并发和多线程Golang vs. Python:并发和多线程Apr 17, 2025 am 12:20 AM

Golang更适合高并发任务,而Python在灵活性上更有优势。1.Golang通过goroutine和channel高效处理并发。2.Python依赖threading和asyncio,受GIL影响,但提供多种并发方式。选择应基于具体需求。

Golang和C:性能的权衡Golang和C:性能的权衡Apr 17, 2025 am 12:18 AM

Golang和C 在性能上的差异主要体现在内存管理、编译优化和运行时效率等方面。1)Golang的垃圾回收机制方便但可能影响性能,2)C 的手动内存管理和编译器优化在递归计算中表现更为高效。

Golang vs. Python:申请和用例Golang vs. Python:申请和用例Apr 17, 2025 am 12:17 AM

selectgolangforhighpperformanceandcorrency,ifealforBackendServicesSandNetwork程序; selectpypypythonforrapiddevelopment,dataScience和machinelearningDuetoitsverserverserverserversator versator anderticality andextility andextentensivelibraries。

Golang vs. Python:主要差异和相似之处Golang vs. Python:主要差异和相似之处Apr 17, 2025 am 12:15 AM

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。 Golang以其并发模型和高效性能着称,Python则以简洁语法和丰富库生态系统着称。

Golang vs. Python:易于使用和学习曲线Golang vs. Python:易于使用和学习曲线Apr 17, 2025 am 12:12 AM

Golang和Python分别在哪些方面更易用和学习曲线更平缓?Golang更适合高并发和高性能需求,学习曲线对有C语言背景的开发者较平缓。Python更适合数据科学和快速原型设计,学习曲线对初学者非常平缓。

表演竞赛:Golang vs.C表演竞赛:Golang vs.CApr 16, 2025 am 12:07 AM

Golang和C 在性能竞赛中的表现各有优势:1)Golang适合高并发和快速开发,2)C 提供更高性能和细粒度控制。选择应基于项目需求和团队技术栈。

Golang vs.C:代码示例和绩效分析Golang vs.C:代码示例和绩效分析Apr 15, 2025 am 12:03 AM

Golang适合快速开发和并发编程,而C 更适合需要极致性能和底层控制的项目。1)Golang的并发模型通过goroutine和channel简化并发编程。2)C 的模板编程提供泛型代码和性能优化。3)Golang的垃圾回收方便但可能影响性能,C 的内存管理复杂但控制精细。

Golang的影响:速度,效率和简单性Golang的影响:速度,效率和简单性Apr 14, 2025 am 12:11 AM

GoimpactsdevelopmentPositationalityThroughSpeed,效率和模拟性。1)速度:gocompilesquicklyandrunseff,ifealforlargeprojects.2)效率:效率:ITScomprehenSevestAndArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdEcceSteral Depentencies,增强开发的简单性:3)SimpleflovelmentIcties:3)简单性。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器