Earthly:Dockerfile 和 Makefile 的完美结合体
Earthly 是一个革命性的构建自动化工具,巧妙地将 Dockerfile 的容器化优势与 Makefile 的灵活性和易用性相结合,为现代软件开发提供了全新的构建范式。它重新定义了构建流程的标准,让开发者能够编写一次构建脚本,即可在任何环境中实现可重复、高效的构建。Earthly 基于 Go 语言构建,底层使用与 Docker 相同的 BuildKit 技术,但提供了更高级的抽象和更强大的功能,其核心价值体现在构建可重复性、极简语法设计、全栈语言支持、智能并行化与缓存以及现代化的导入系统等方面。
Earthly 项目介绍与核心价值
Earthly 是一个革命性的构建自动化工具,它巧妙地将 Dockerfile 的容器化优势与 Makefile 的灵活性和易用性相结合,为现代软件开发提供了全新的构建范式。作为 Dockerfile 和 Makefile 的完美结合体,Earthly 重新定义了构建流程的标准,让开发者能够编写一次构建脚本,即可在任何环境中实现可重复、高效的构建。
项目定位与技术架构
Earthly 定位为一个超级简单的构建框架,其核心设计理念是提供快速、可重复的构建体验,同时保持语法的高度直观性。项目基于 Go 语言构建,充分利用了容器技术的优势,底层使用与 Docker 相同的 BuildKit 技术,但在此基础上提供了更高级的抽象和更强大的功能。
核心价值主张
Earthly 的核心价值体现在以下几个关键方面:
1. 构建可重复性(Repeatable Builds)
Earthly 通过在容器中执行所有构建步骤,确保了构建过程的完全隔离和一致性。这意味着无论构建在开发者的本地机器、远程服务器还是任何 CI/CD 环境中运行,结果都是完全一致的。
| 特性 | 传统构建工具 | Earthly |
|---|---|---|
| 环境一致性 | 依赖系统环境 | 容器化隔离 |
| 依赖管理 | 手动安装配置 | 声明式定义 |
| 可移植性 | 有限 | 完全可移植 |
2. 极简语法设计(Super Simple Syntax)
Earthly 的语法设计借鉴了 Dockerfile 和 Makefile 的最佳实践,使得大多数工程师无需学习新知识就能立即理解 Earthfile 的结构。这种设计大大降低了学习曲线,提高了团队协作效率。
# 示例 Earthfile 结构
VERSION 0.8
FROM golang:1.19-alpine
build:
COPY go.mod go.sum .
RUN go mod download
COPY . .
RUN go build -o app main.go
SAVE ARTIFACT app AS LOCAL bin/app
docker:
FROM alpine:latest
COPY +build/app /usr/local/bin/
ENTRYPOINT ["/usr/local/bin/app"]
SAVE IMAGE my-app:latest
3. 全栈语言支持(Universal Language Support)
Earthly 与所有编程语言、框架和构建工具完全兼容。只要能够在 Linux 环境中运行的工具,都可以在 Earthly 中无缝使用,无需重写现有的构建配置。
4. 智能并行化与缓存(Intelligent Parallelization & Caching)
Earthly 自动分析构建目标之间的依赖关系,构建有向无环图(DAG),并尽可能并行执行独立的目标。同时,它提供了与 Docker 构建相同的缓存机制,显著提升了构建速度。
5. 现代化的导入系统(Modern Import System)
Earthly 引入了革命性的导入机制,允许开发者跨目录甚至跨代码库重用构建逻辑。这种设计特别适合 monorepo 和 polyrepo 架构,极大地促进了代码复用。
# 导入本地其他目录的目标
BUILD ./shared-lib+build
# 导入远程代码库的目标
BUILD github.com/org/repo:v1.0.0+build
# 使用导入的制品
COPY github.com/org/repo:v1.0.0+build/bin/app ./vendor/app
技术实现原理
Earthly 的技术实现基于以下几个核心组件:
- 容器运行时集成:利用 Docker 容器提供隔离的执行环境
- BuildKit 后端:使用与 Docker 相同的底层构建引擎
- 依赖图分析:自动解析目标间的依赖关系并优化执行顺序
- 智能缓存策略:基于内容哈希的精细粒度缓存管理
- 跨平台支持:原生支持多架构容器构建
适用场景与优势
Earthly 特别适用于以下场景:
- 复杂项目的构建管理:当项目包含多个相互依赖的组件时
- 混合技术栈项目:使用多种编程语言和构建工具的项目
- CI/CD 流水线标准化:确保开发、测试、生产环境构建一致性
- 大规模团队协作:需要统一构建标准和流程的团队
- 多平台应用部署:需要为不同架构构建二进制文件的应用
通过将 Dockerfile 的容器化优势与 Makefile 的灵活性和易读性完美结合,Earthly 为现代软件开发提供了真正意义上的"一次编写,处处运行"的构建体验,极大地提升了开发效率和构建可靠性。
Earthly 与传统构建工具对比分析
在现代软件开发中,构建工具的选择直接影响着开发效率和部署质量。Earthly 作为新一代构建工具,与传统工具如 Dockerfile、Makefile、Bash 脚本等相比,展现出了显著的优势。本节将从多个维度深入分析 Earthly 与传统构建工具的差异。
语法设计与可读性对比
Earthly 采用了独特的语法设计,结合了 Dockerfile 的容器化优势和 Makefile 的目标依赖管理,形成了直观易读的 Earthfile 格式。
传统工具语法特点:
# Dockerfile - 专注于镜像构建
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
CMD ["npm", "start"]
# Makefile - 基于 shell 命令的目标管理
build:
docker build -t myapp .
test:
docker run myapp npm test
push:
docker push myapp
Earthfile 语法优势:
# Earthfile - 结合两者优势
VERSION 0.8
FROM node:18-alpine
WORKDIR /app
deps:
COPY package*.json ./
RUN npm install
SAVE ARTIFACT package*.json
build:
FROM +deps
COPY . .
RUN npm run build
SAVE ARTIFACT dist/
test:
FROM +deps
COPY . .
RUN npm test
docker:
COPY +build/dist/ .
CMD ["npm", "start"]
SAVE IMAGE myapp:latest
Earthfile 的语法设计使得构建逻辑更加清晰,每个目标都有明确的输入输出,便于理解和维护。
构建执行模型对比
| 特性 | Earthly | Dockerfile | Makefile | Bash 脚本 |
|---|---|---|---|---|
| 并行执行 | ✅ 自动并行 | ❌ 顺序执行 | ⚠️ 手动配置 | ❌ 顺序执行 |
| 缓存机制 | ✅ 智能缓存 | ✅ 分层缓存 | ❌ 无内置缓存 | ❌ 无内置缓存 |
| 环境隔离 | ✅ 容器隔离 | ✅ 容器隔离 | ❌ 宿主机环境 | ❌ 宿主机环境 |
| 依赖管理 | ✅ 显式声明 | ⚠️ 隐式依赖 | ⚠️ 文件时间戳 | ❌ 手动管理 |
| 跨平台支持 | ✅ 原生支持 | ✅ 原生支持 | ❌ 平台相关 | ❌ 平台相关 |
Earthly 的构建执行模型基于有向无环图(DAG),能够自动分析目标间的依赖关系并并行执行独立任务,大幅提升构建效率。
缓存机制深度分析
Earthly 的缓存机制是其核心优势之一,相比传统工具更加智能和高效:
Dockerfile 缓存:
- 基于指令层级缓存
- 缓存失效条件严格
- 无法跨构建共享缓存
Earthly 缓存:
- 基于目标层级缓存
- 智能依赖分析
- 支持远程缓存共享
- 跨项目缓存复用
# Earthly 缓存示例 - 依赖变更自动失效缓存
VERSION 0.8
FROM python:3.9-slim
deps:
COPY requirements.txt .
RUN pip install -r requirements.txt
# 仅当 requirements.txt 变更时重新执行
app:
FROM +deps
COPY src/ .
# 仅当 src/ 文件变更时重新构建
RUN python -m compileall .
跨环境一致性保障
传统构建工具在跨环境一致性方面存在显著挑战:
Makefile + Bash 的问题:
- 依赖宿主机环境变量
- 工具版本不一致
- 路径差异导致构建失败
- 难以复现构建环境
Earthly 的解决方案:
- 所有构建在容器中执行
- 环境完全隔离和标准化
- 工具版本精确控制
- 构建结果完全可重现
复杂项目支持能力
对于大型复杂项目,Earthly 展现出更强的适应性:
Monorepo 支持对比:
# Earthly monorepo 示例
VERSION 0.8
# 前端项目
frontend:
BUILD ./frontend+build
# 后端项目
backend:
BUILD ./backend+build
# 共享工具库
common-utils:
BUILD ./libs/common-utils+build
# 整体构建
all:
BUILD +common-utils
BUILD +frontend
BUILD +backend
BUILD +integration-test
传统工具在 monorepo 场景下往往需要复杂的脚本编排,而 Earthly 通过内置的导入和引用机制天然支持多项目协作。
集成与扩展性分析
Earthly 在 CI/CD 集成方面具有明显优势:
CI 集成复杂度:
- Earthly: 单一命令集成,环境无关
- 传统工具: 需要配置复杂的环境准备步骤
扩展模式对比:
| 扩展需求 | Earthly 方案 | 传统方案 |
|---|---|---|
| 新增构建步骤 | 添加 Earthfile 目标 | 修改 Makefile/Bash |
| 跨项目复用 | BUILD github.com/... | 手动复制脚本 |
| 多平台构建 | 内置平台参数 | 手动交叉编译配置 |
| 测试集成 | 内置测试目标 | 外部测试框架集成 |
学习曲线与迁移成本
虽然 Earthly 引入了新的概念,但其学习曲线相对平缓:
迁移路径分析:
从 Dockerfile 迁移到 Earthfile 通常只需要复制粘贴并稍作调整,大多数 Dockerfile 指令在 Earthly 中都有对应实现。
性能基准对比
在实际项目中的性能表现:
| 场景 | Earthly | Dockerfile | Makefile |
|---|---|---|---|
| 初次构建 | 基准时间 | 类似时间 | 类似时间 |
| 增量构建 | ⚡ 快速(智能缓存) | 🐢 中等(层级缓存) | 🐌 慢(无缓存) |
| 并行构建 | ⚡ 快速(自动并行) | ❌ 不支持 | ⚠️ 手动配置 |
| 跨团队共享 | ✅ 远程缓存 | ❌ 无共享 | ❌ 无共享 |
适用场景推荐
基于对比分析,以下是工具选型建议:
- 简单镜像构建: Dockerfile 足够
- 复杂多阶段构建: Earthly 更优
- 本地开发脚本: Makefile 仍有用武之地
- 企业级CI/CD: Earthly 提供完整解决方案
- 跨团队协作: Earthly 远程缓存优势明显
- 混合技术栈: Earthly 统一构建接口
Earthly 并非要完全取代传统工具,而是在复杂构建场景下提供了更现代化、更高效的解决方案。其设计哲学是"站在巨人的肩膀上",吸收 Dockerfile 和 Makefile 的优点,同时解决它们的局限性。
Earthfile 语法基础与快速入门
Earthfile 是 Earthly 的核心配置文件,它融合了 Dockerfile 和 Makefile 的最佳特性,提供了一种既熟悉又强大的构建语法。无论你是 Docker 用户还是 Makefile 用户,都能快速上手 Earthfile。
Earthfile 基本结构
每个 Earthfile 都以 VERSION 声明开始,后跟一系列目标(target)定义。基本结构如下:
VERSION 0.8
FROM base-image
target-name:
# 构建步骤
RUN command
COPY files
SAVE ARTIFACT output
核心指令详解
VERSION 指令
每个 Earthfile 必须以 VERSION 指令开头,指定 Earthly 版本:
VERSION 0.8
FROM 指令
FROM 指令设置基础镜像,支持多种引用方式:
# 使用 Docker 镜像
FROM alpine:3.18
# 引用本地目标
FROM +deps
# 引用其他目录的目标
FROM ./subdir+build-target
# 引用远程仓库目标
FROM github.com/user/repo:v1.0+target
RUN 指令
执行命令,支持丰富的选项:
# 基本用法
RUN apt-get update && apt-get install -y git
# 使用选项
RUN --no-cache npm install
RUN --push docker push my-image:latest
RUN --secret API_KEY=token deploy-script
COPY 指令
复制文件和目录,支持从其他目标复制制品:
# 复制本地文件
COPY src/ ./src/
# 从其他目标复制制品
COPY +build/app ./app
# 复制多个文件
COPY package.json package-lock.json ./
SAVE 指令
保存构建产出,分为制品和镜像:
# 保存制品(文件或目录)
SAVE ARTIFACT build/output /app AS LOCAL dist/
# 保存镜像
SAVE IMAGE my-app:latest
SAVE IMAGE --push registry/my-app:v1.0
目标定义与依赖管理
Earthfile 使用目标(target)来组织构建逻辑,目标之间可以建立依赖关系:
完整示例分析
让我们通过一个完整的 Go 项目 Earthfile 来理解语法:
VERSION 0.8
FROM golang:1.21-alpine3.18
WORKDIR /go-example
deps:
COPY go.mod go.sum ./
RUN go mod download
SAVE ARTIFACT go.mod AS LOCAL go.mod
SAVE ARTIFACT go.sum AS LOCAL go.sum
build:
FROM +deps
COPY main.go .
RUN go build -o build/go-example main.go
SAVE ARTIFACT build/go-example /go-example AS LOCAL build/go-example
docker:
COPY +build/go-example .
ENTRYPOINT ["/go-example/go-example"]
SAVE IMAGE --push earthly/examples:go
all:
BUILD +build
BUILD +docker
关键特性表格
| 特性 | 语法示例 | 说明 |
|---|---|---|
| 多阶段构建 | FROM +target | 引用其他目标作为基础 |
| 并行执行 | BUILD +target1 +target2 | 自动并行化独立目标 |
| 制品共享 | COPY +target/artifact | 跨目标共享构建产出 |
| 缓存机制 | RUN --no-cache | 精细控制缓存行为 |
| 秘密管理 | RUN --secret KEY=value | 安全处理敏感信息 |
| 远程引用 | FROM github.com/... | 引用远程仓库目标 |
快速入门步骤
- 创建 Earthfile:在项目根目录创建
Earthfile文件 - 声明版本:以
VERSION 0.8开头 - 定义基础镜像:使用
FROM指定基础环境 - 组织构建目标:按功能划分目标(deps、build、test等)
- 建立目标依赖:使用
FROM +target引用依赖 - 保存构建产出:使用
SAVE ARTIFACT和SAVE IMAGE - 执行构建:运行
earthly +target-name
最佳实践提示
- 使用明确的目标命名(如
deps、build、test、docker) - 将依赖安装与构建分离到不同目标
- 利用
SAVE ARTIFACT共享中间制品 - 为生产部署使用
SAVE IMAGE --push - 使用
WORKDIR设置工作目录避免路径混乱
Earthfile 的语法设计既保持了 Dockerfile 的直观性,又引入了 Makefile 的目标依赖管理能力,使得构建脚本更加模块化、可重用和可维护。
Earthly 在现代化开发流程中的定位
在当今快速迭代的软件开发环境中,构建和部署流程的复杂性日益增加。Earthly 作为一个现代化的构建自动化工具,在开发流程中扮演着至关重要的桥梁角色,将开发者的本地环境与持续集成/持续部署(CI/CD)流水线无缝连接起来。
开发与生产环境的一致性保障
Earthly 通过容器化技术确保了构建环境的一致性,这是现代化开发流程中的核心需求。传统的开发流程中,开发者经常面临"在我机器上能运行"的问题,而 Earthly 彻底解决了这一痛点。
这种一致性机制使得开发者能够在本地环境中完全复现 CI/CD 流水线的构建过程,大大减少了因环境差异导致的构建失败。
多语言和多框架的统一构建平台
现代软件开发往往涉及多种编程语言和技术栈的混合使用。Earthly 提供了一个统一的构建抽象层,能够处理各种不同的构建工具和依赖管理方式。
| 技术栈 | Earthly 支持方式 | 优势 |
|---|---|---|
| Go | 集成 go.mod 和 go build | 自动依赖下载和缓存 |
| JavaScript/Node.js | 支持 npm/yarn/pnpm | 统一的 node_modules 管理 |
| Python | 兼容 pip 和 virtualenv | 环境隔离和依赖锁定 |
| Java | Maven/Gradle 集成 | 构建工具版本管理 |
| Rust | Cargo 支持 | 编译缓存优化 |
现代化开发工作流的集成
Earthly 与现代开发工具链深度集成,支持各种开发场景:
本地开发体验优化:
- 支持热重载和文件监听模式
- 与 IDE 和编辑器插件集成
- 提供详细的构建日志和调试信息
团队协作标准化:
# 团队共享的基础构建模板
VERSION 0.8
FROM earthly/dev-base:latest
# 标准化构建阶段
base-setup:
RUN apt-get update && apt-get install -y common-dependencies
SAVE IMAGE
code-quality:
FROM +base-setup
RUN install-linters
SAVE ARTIFACT . AS LOCAL quality-tools
微服务和云原生架构的支持
在微服务架构中,Earthly 能够有效管理多个服务的构建依赖关系:
DevOps 文化的实践工具
Earthly 促进了 DevOps 文化的落地实施,它使得:
- 开发者和运维人员的协作更加顺畅 - 构建脚本成为团队共享的资产
- 基础设施即代码的实践 - Earthfile 作为可版本控制的构建基础设施
- 可观测性的提升 - 详细的构建时间线和性能指标
- 安全性的增强 - 容器隔离和依赖漏洞扫描集成
未来开发模式的演进支持
随着云原生和边缘计算的发展,Earthly 的定位也在不断演进:
- 多架构构建支持:同时构建 x86、ARM 等多种架构的镜像
- 混合云部署:统一的构建流程适应不同的云环境
- AI/ML 工作流集成:支持机器学习模型的版本化和可重复构建
- 无服务器架构:为 serverless 函数提供标准化的打包方式
Earthly 在现代化开发流程中的定位不仅仅是另一个构建工具,而是一个连接开发、测试、部署各环节的综合性平台。它通过提供一致的构建环境、支持多种技术栈、集成现代开发工具链,以及适应云原生架构的需求,成为了现代化软件开发不可或缺的基础设施。这种定位使得 Earthly 能够帮助团队构建更加可靠、高效和可维护的软件交付流水线,最终提升整个组织的软件开发效能和质量水平。
Earthly 在现代化开发流程中的定位总结
Earthly 在现代化开发流程中定位为一个连接开发、测试、部署各环节的综合性平台,而不仅仅是另一个构建工具。它通过提供一致的构建环境、支持多种技术栈、集成现代开发工具链,以及适应云原生架构的需求,成为了现代化软件开发不可或缺的基础设施。Earthly 促进了 DevOps 文化的落地实施,使得开发者和运维人员的协作更加顺畅,构建脚本成为团队共享的资产,同时支持未来开发模式的演进,包括多架构构建、混合云部署、AI/ML 工作流集成和无服务器架构等。这种定位使得 Earthly 能够帮助团队构建更加可靠、高效和可维护的软件交付流水线,最终提升整个组织的软件开发效能和质量水平。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



