Earthly项目实战:在构建流程中集成Docker容器

Earthly项目实战:在构建流程中集成Docker容器

earthly Super simple build framework with fast, repeatable builds and an instantly familiar syntax – like Dockerfile and Makefile had a baby. earthly 项目地址: https://gitcode.com/gh_mirrors/ea/earthly

前言

在现代软件开发中,容器化技术已经成为不可或缺的一部分。Earthly作为一个创新的构建工具,提供了与Docker深度集成的能力,使得在构建流程中使用Docker容器变得异常简单。本文将详细介绍如何在Earthly构建过程中使用WITH DOCKER命令,以及几种实际应用场景。

什么是WITH DOCKER命令

WITH DOCKER是Earthly提供的一个强大命令,它允许在构建目标(target)内部启动一个Docker守护进程。这个特性特别适合以下场景:

  1. 需要在构建过程中运行容器化服务
  2. 执行依赖Docker的集成测试
  3. 构建多容器应用环境

基本语法结构

target-name:
    FROM earthly/dind:alpine-3.19-docker-25.0.5-r0
    WITH DOCKER [选项]
        # 在这里可以使用docker命令
        RUN docker [命令]
    END

Earthly推荐使用其官方提供的earthly/dind镜像作为基础,这个镜像已经预装了Docker守护进程。

实际应用场景

场景一:拉取并运行Docker镜像

最简单的使用场景是拉取并运行一个现有的Docker镜像:

hello-world-example:
    FROM earthly/dind:alpine-3.19-docker-25.0.5-r0
    WITH DOCKER --pull hello-world
        RUN docker run hello-world
    END

在这个例子中:

  • --pull hello-world表示在启动Docker环境前先拉取hello-world镜像
  • WITH DOCKER块内部,可以直接使用docker run命令运行容器

场景二:加载本地构建的镜像

更常见的情况是,我们需要使用Earthly构建的镜像:

build-custom-image:
    FROM ubuntu
    CMD echo "hello from custom image"
    SAVE IMAGE custom-image:latest

run-custom-image:
    FROM earthly/dind:alpine-3.19-docker-25.0.5-r0
    WITH DOCKER --load custom:latest=+build-custom-image
        RUN docker run custom:latest
    END

关键点:

  • --load选项用于加载由其他目标构建的镜像
  • 语法格式为--load [本地名称]=+[构建目标]
  • 加载后的镜像可以在WITH DOCKER块内使用

实战:集成测试环境

一个典型的应用场景是设置集成测试环境。假设我们有一个Go应用需要Redis服务:

项目结构

.
├── docker-compose.yml
├── main.go
└── main_integration_test.go

Docker Compose配置

version: "3"
services:
  redis:
    image: redis:6.0-alpine
    ports:
      - "6379:6379"
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]

Earthfile配置

VERSION 0.8
FROM golang:1.15-alpine3.13
WORKDIR /go-workdir

deps:
    COPY go.mod go.sum ./
    RUN go mod download

test-setup:
    FROM +deps
    COPY . .
    ENTRYPOINT ["go", "test"]
    SAVE IMAGE test-image:latest

integration-tests:
    FROM earthly/dind:alpine-3.19-docker-25.0.5-r0
    COPY docker-compose.yml ./
    WITH DOCKER \
        --compose docker-compose.yml \
        --load test-image=+test-setup
        RUN docker run --network=default_default test-image
    END

关键要素:

  1. 使用--compose启动Redis服务
  2. 加载测试镜像
  3. 运行测试时连接到Redis容器网络

运行命令:

earthly -P +integration-tests

多语言示例

JavaScript全栈应用

对于JavaScript全栈应用,可以同时启动前端和后端服务:

app-with-api:
    FROM earthly/dind:alpine-3.19-docker-25.0.5-r0
    WITH DOCKER \
        --load frontend=+build-frontend \
        --load backend=+build-backend
        RUN docker run -d -p 3000:3000 backend && \
            docker run -d -p 8080:8080 frontend && \
            curl localhost:8080
    END

Python集成测试

Python项目可以使用PostgreSQL进行数据库测试:

run-tests:
    FROM earthly/dind:alpine-3.19-docker-25.0.5-r0
    COPY docker-compose.yml .
    WITH DOCKER --compose docker-compose.yml
        RUN while ! pg_isready -h localhost; do sleep 1; done && \
            python -m unittest discover
    END

最佳实践

  1. 网络配置:确保容器在正确的网络中运行,特别是需要互相通信的服务
  2. 健康检查:使用健康检查或等待机制确保依赖服务完全启动
  3. 资源清理:Earthly会自动清理WITH DOCKER块中创建的容器
  4. 权限管理:某些操作需要--allow-privileged标志

总结

Earthly的WITH DOCKER功能为构建流程中的容器化操作提供了强大支持。无论是简单的容器运行,还是复杂的多服务集成测试环境,都能通过简洁的语法实现。这种深度集成使得Earthly成为现代云原生应用开发的理想构建工具。

通过本文的示例和实践建议,开发者可以快速掌握在Earthly构建流程中使用Docker容器的技巧,提升开发效率和构建可靠性。

earthly Super simple build framework with fast, repeatable builds and an instantly familiar syntax – like Dockerfile and Makefile had a baby. earthly 项目地址: https://gitcode.com/gh_mirrors/ea/earthly

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乔印朗Dale

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值